Andrew Nguyen : rundll32: Recognize entry points passed as ordinal numbers.

Alexandre Julliard julliard at winehq.org
Tue May 4 13:06:37 CDT 2010


Module: wine
Branch: master
Commit: a42c072830dfd552559d2a9002c55965c42809fa
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a42c072830dfd552559d2a9002c55965c42809fa

Author: Andrew Nguyen <anguyen at codeweavers.com>
Date:   Tue May  4 07:46:20 2010 -0500

rundll32: Recognize entry points passed as ordinal numbers.

---

 programs/rundll32/rundll32.c |   48 +++++++++++++++++++++++++++--------------
 1 files changed, 31 insertions(+), 17 deletions(-)

diff --git a/programs/rundll32/rundll32.c b/programs/rundll32/rundll32.c
index e8ac8a5..c619693 100644
--- a/programs/rundll32/rundll32.c
+++ b/programs/rundll32/rundll32.c
@@ -119,30 +119,44 @@ static FARPROC16 get_entry_point16( HINSTANCE16 inst, LPCWSTR entry )
 static void *get_entry_point32( HMODULE module, LPCWSTR entry, BOOL *unicode )
 {
     void *ret;
-    DWORD len = WideCharToMultiByte( CP_ACP, 0, entry, -1, NULL, 0, NULL, NULL );
-    char *entryA = HeapAlloc( GetProcessHeap(), 0, len + 1 );
-
-    if (!entryA)
-        return NULL;
 
-    WideCharToMultiByte( CP_ACP, 0, entry, -1, entryA, len, NULL, NULL );
+    /* determine if the entry point is an ordinal */
+    if (entry[0] == '#')
+    {
+        int ordinal = atoiW( entry + 1 );
+        if (ordinal <= 0)
+            return NULL;
 
-    /* first try the W version */
-    *unicode = TRUE;
-    strcat( entryA, "W" );
-    if (!(ret = GetProcAddress( module, entryA )))
+        *unicode = TRUE;
+        ret = GetProcAddress( module, (LPCSTR)ordinal );
+    }
+    else
     {
-        /* now the A version */
-        *unicode = FALSE;
-        entryA[strlen(entryA)-1] = 'A';
+        DWORD len = WideCharToMultiByte( CP_ACP, 0, entry, -1, NULL, 0, NULL, NULL );
+        char *entryA = HeapAlloc( GetProcessHeap(), 0, len + 1 );
+
+        if (!entryA)
+            return NULL;
+
+        WideCharToMultiByte( CP_ACP, 0, entry, -1, entryA, len, NULL, NULL );
+
+        /* first try the W version */
+        *unicode = TRUE;
+        strcat( entryA, "W" );
         if (!(ret = GetProcAddress( module, entryA )))
         {
-            /* now the version without suffix */
-            entryA[strlen(entryA)-1] = 0;
-            ret = GetProcAddress( module, entryA );
+            /* now the A version */
+            *unicode = FALSE;
+            entryA[strlen(entryA)-1] = 'A';
+            if (!(ret = GetProcAddress( module, entryA )))
+            {
+                /* now the version without suffix */
+                entryA[strlen(entryA)-1] = 0;
+                ret = GetProcAddress( module, entryA );
+            }
         }
+        HeapFree( GetProcessHeap(), 0, entryA );
     }
-    HeapFree( GetProcessHeap(), 0, entryA );
     return ret;
 }
 




More information about the wine-cvs mailing list