diff --git a/files/dos_fs.c b/files/dos_fs.c
index ccc7a18..c134821 100644
--- a/files/dos_fs.c
+++ b/files/dos_fs.c
@@ -79,7 +79,7 @@
 };
 
 #define GET_DRIVE(path) \
-    (((path)[1] == ':') ? toupper((path)[0]) - 'A' : DOSFS_CurDrive)
+    (((path)[1] == ':') ? FILE_toupper((path)[0]) - 'A' : DOSFS_CurDrive)
 
 /* Directory info for DOSFS_ReadDir */
 typedef struct
@@ -196,7 +196,7 @@
             break;
         default:
             if (strchr( invalid_chars, *p )) return FALSE;
-            buffer[i] = toupper(*p);
+            buffer[i] = FILE_toupper(*p);
             p++;
             break;
         }
@@ -233,7 +233,7 @@
             break;
         default:
             if (strchr( invalid_chars, *p )) return FALSE;
-            buffer[i] = toupper(*p);
+            buffer[i] = FILE_toupper(*p);
             p++;
             break;
         }
@@ -318,7 +318,7 @@
 
             /* skip to the next match after the joker(s) */
             if (case_sensitive) while (*name && (*name != *mask)) name++;
-            else while (*name && (toupper(*name) != toupper(*mask))) name++;
+            else while (*name && (FILE_toupper(*name) != FILE_toupper(*mask))) name++;
 
             if (!*name) break;
             next_to_retry = name;
@@ -332,7 +332,7 @@
             }
             else
             {
-                if (toupper(*mask) != toupper(*name)) mismatch = 1;
+                if (FILE_toupper(*mask) != FILE_toupper(*name)) mismatch = 1;
             }
             if (!mismatch)
             {
@@ -500,13 +500,13 @@
         /* Simply copy the name, converting to uppercase */
 
         for (dst = buffer; !IS_END_OF_NAME(*name) && (*name != '.'); name++)
-            *dst++ = toupper(*name);
+            *dst++ = FILE_toupper(*name);
         if (*name == '.')
         {
             if (dir_format) dst = buffer + 8;
             else *dst++ = '.';
             for (name++; !IS_END_OF_NAME(*name); name++)
-                *dst++ = toupper(*name);
+                *dst++ = FILE_toupper(*name);
         }
         if (!dir_format) *dst = '\0';
         return;
@@ -518,8 +518,8 @@
     if (ignore_case)
     {
         for (p = name, hash = 0xbeef; !IS_END_OF_NAME(p[1]); p++)
-            hash = (hash<<3) ^ (hash>>5) ^ tolower(*p) ^ (tolower(p[1]) << 8);
-        hash = (hash<<3) ^ (hash>>5) ^ tolower(*p); /* Last character*/
+            hash = (hash<<3) ^ (hash>>5) ^ FILE_tolower(*p) ^ (FILE_tolower(p[1]) << 8);
+        hash = (hash<<3) ^ (hash>>5) ^ FILE_tolower(*p); /* Last character*/
     }
     else
     {
@@ -538,7 +538,7 @@
     for (i = 4, p = name, dst = buffer; i > 0; i--, p++)
     {
         if (IS_END_OF_NAME(*p) || (p == ext)) break;
-        *dst++ = strchr( invalid_chars, *p ) ? '_' : toupper(*p);
+        *dst++ = strchr( invalid_chars, *p ) ? '_' : FILE_toupper(*p);
     }
     /* Pad to 5 chars with '~' */
     while (i-- >= 0) *dst++ = '~';
@@ -553,7 +553,7 @@
     {
         if (!dir_format) *dst++ = '.';
         for (i = 3, ext++; (i > 0) && !IS_END_OF_NAME(*ext); i--, ext++)
-            *dst++ = strchr( invalid_chars, *ext ) ? '_' : toupper(*ext);
+            *dst++ = strchr( invalid_chars, *ext ) ? '_' : FILE_toupper(*ext);
     }
     if (!dir_format) *dst = '\0';
 }
@@ -608,7 +608,7 @@
             }
             else
             {
-                if (!strncasecmp( long_name, name, len )) break;
+                if (!FILE_strncasecmp( long_name, name, len )) break;
             }
         }
         if (dos_name[0])
@@ -659,7 +659,7 @@
     for (i = 0; i < sizeof(DOSFS_Devices)/sizeof(DOSFS_Devices[0]); i++)
     {
         const char *dev = DOSFS_Devices[i].name;
-        if (!strncasecmp( dev, name, strlen(dev) ))
+        if (!FILE_strncasecmp( dev, name, strlen(dev) ))
         {
             p = name + strlen( dev );
             if (!*p || (*p == '.')) return &DOSFS_Devices[i];
@@ -744,7 +744,7 @@
     for (i = 0; i < sizeof(DOSFS_Devices)/sizeof(DOSFS_Devices[0]); i++)
     {
         const char *dev = DOSFS_Devices[i].name;
-        if (!strncasecmp( dev, name, strlen(dev) ))
+        if (!FILE_strncasecmp( dev, name, strlen(dev) ))
         {
             p = name + strlen( dev );
             if (!*p || (*p == '.')) {
@@ -802,7 +802,7 @@
 
     if (*p && (p[1] == ':'))
     {
-        drive = toupper(*p) - 'A';
+        drive = FILE_toupper(*p) - 'A';
         *name += 2;
     }
     else if (*p == '/') /* Absolute Unix path? */
@@ -925,11 +925,11 @@
                    (p_s < full->short_name + sizeof(full->short_name) - 1) &&
                    (p_l < full->long_name + sizeof(full->long_name) - 1))
             {
-                *p_s++ = tolower(*name);
+                *p_s++ = FILE_tolower(*name);
                 /* If the drive is case-sensitive we want to create new */
                 /* files in lower-case otherwise we can't reopen them   */
                 /* under the same short name. */
-	    	if (flags & DRIVE_CASE_SENSITIVE) *p_l++ = tolower(*name);
+	    	if (flags & DRIVE_CASE_SENSITIVE) *p_l++ = FILE_tolower(*name);
 		else *p_l++ = *name;
                 name++;
             }
@@ -1197,7 +1197,7 @@
       /*absolute path given */
       {
 	lstrcpynA(full_name.short_name,name,MAX_PATHNAME_LEN);
-	drive = (int)toupper(name[0]) - 'A';
+	drive = (int)FILE_toupper(name[0]) - 'A';
       }
     else
       {
@@ -1211,7 +1211,7 @@
 	    return 0;
 	  }
 	/* find path that drive letter substitutes*/
-	drive = (int)toupper(full_name.short_name[0]) -0x41;
+	drive = (int)FILE_toupper(full_name.short_name[0]) -0x41;
 	root= DRIVE_GetRoot(drive);
 	if (!root)
 	  {
@@ -1279,7 +1279,7 @@
 	memmove(p+1,p+3,strlen(p+3)+1);
       }
     if (!(DRIVE_GetFlags(drive) & DRIVE_CASE_PRESERVING))
-      _strupr( full_name.short_name );
+        for (p = full_name.short_name; *p; p++) *p = FILE_toupper(*p);
     namelen=strlen(full_name.short_name);
     if (!strcmp(full_name.short_name+namelen-3,"\\.."))
 	{
@@ -1596,7 +1596,7 @@
           info->short_mask = NULL;
           info->attr = 0xff;
           if (lpFileName[0] && (lpFileName[1] == ':'))
-              info->drive = toupper(*lpFileName) - 'A';
+              info->drive = FILE_toupper(*lpFileName) - 'A';
           else info->drive = DRIVE_GetCurrentDrive();
           info->cur_pos = 0;
 
@@ -2256,7 +2256,7 @@
         *(info->long_mask++) = '\0';
     info->short_mask = NULL;
     info->attr = 0xff;
-    if (path[0] && (path[1] == ':')) info->drive = toupper(*path) - 'A';
+    if (path[0] && (path[1] == ':')) info->drive = FILE_toupper(*path) - 'A';
     else info->drive = DRIVE_GetCurrentDrive();
     info->cur_pos = 0;
 
diff --git a/files/file.c b/files/file.c
index 06e232c..5259bc8 100644
--- a/files/file.c
+++ b/files/file.c
@@ -86,161 +86,35 @@
 }
 
 
-#if 0
 /***********************************************************************
- *              FILE_ShareDeny
+ *              FILE_strcasecmp
  *
- * PARAMS
- *       oldmode[I] mode how file was first opened
- *       mode[I] mode how the file should get opened
- * RETURNS
- *      TRUE: deny open
- *      FALSE: allow open
- *
- * Look what we have to do with the given SHARE modes
- *
- * Ralph Brown's interrupt list gives following explication, I guess
- * the same holds for Windows, DENY ALL should be OF_SHARE_COMPAT
- *
- * FIXME: Validate this function
-========from Ralph Brown's list =========
-(Table 0750)
-Values of DOS file sharing behavior:
-          |     Second and subsequent Opens
- First    |Compat  Deny   Deny   Deny   Deny
- Open     |        All    Write  Read   None
-          |R W RW R W RW R W RW R W RW R W RW
- - - - - -| - - - - - - - - - - - - - - - - -
- Compat R |Y Y Y  N N N  1 N N  N N N  1 N N
-        W |Y Y Y  N N N  N N N  N N N  N N N
-        RW|Y Y Y  N N N  N N N  N N N  N N N
- - - - - -|
- Deny   R |C C C  N N N  N N N  N N N  N N N
- All    W |C C C  N N N  N N N  N N N  N N N
-        RW|C C C  N N N  N N N  N N N  N N N
- - - - - -|
- Deny   R |2 C C  N N N  Y N N  N N N  Y N N
- Write  W |C C C  N N N  N N N  Y N N  Y N N
-        RW|C C C  N N N  N N N  N N N  Y N N
- - - - - -|
- Deny   R |C C C  N N N  N Y N  N N N  N Y N
- Read   W |C C C  N N N  N N N  N Y N  N Y N
-        RW|C C C  N N N  N N N  N N N  N Y N
- - - - - -|
- Deny   R |2 C C  N N N  Y Y Y  N N N  Y Y Y
- None   W |C C C  N N N  N N N  Y Y Y  Y Y Y
-        RW|C C C  N N N  N N N  N N N  Y Y Y
-Legend: Y = open succeeds, N = open fails with error code 05h
-        C = open fails, INT 24 generated
-        1 = open succeeds if file read-only, else fails with error code
-        2 = open succeeds if file read-only, else fails with INT 24      
-========end of description from Ralph Brown's List =====
-	For every "Y" in the table we return FALSE
-	For every "N" we set the DOS_ERROR and return TRUE 
-	For all	other cases we barf,set the DOS_ERROR and return TRUE
-
+ * locale-independent case conversion for file I/O
  */
-static BOOL FILE_ShareDeny( int mode, int oldmode)
+int FILE_strcasecmp( const char *str1, const char *str2 )
 {
-  int oldsharemode = oldmode & 0x70;
-  int sharemode    =    mode & 0x70;
-  int oldopenmode  = oldmode & 3;
-  int openmode     =    mode & 3;
-  
-  switch (oldsharemode)
+    for (;;)
     {
-    case OF_SHARE_COMPAT:
-      if (sharemode == OF_SHARE_COMPAT) return FALSE;
-      if (openmode  == OF_READ) goto test_ro_err05;
-      goto fail_error05;
-    case OF_SHARE_EXCLUSIVE:
-      if (sharemode == OF_SHARE_COMPAT) goto fail_int24;
-      goto fail_error05;
-    case OF_SHARE_DENY_WRITE:
-      if (openmode  != OF_READ)
-	{
-	  if (sharemode == OF_SHARE_COMPAT) goto fail_int24;
-	  goto fail_error05;
-	}
-      switch (sharemode)
-	{
-	case OF_SHARE_COMPAT:
-	  if (oldopenmode == OF_READ) goto test_ro_int24;
-	  goto fail_int24;
-	case OF_SHARE_DENY_NONE: 
-	  return FALSE;
-	case OF_SHARE_DENY_WRITE:
-	  if (oldopenmode == OF_READ) return FALSE;
-	case OF_SHARE_DENY_READ:
-	  if (oldopenmode == OF_WRITE) return FALSE;
-	case OF_SHARE_EXCLUSIVE:
-	default:
-	  goto fail_error05;
-	}
-      break;
-    case OF_SHARE_DENY_READ:
-      if (openmode  != OF_WRITE)
-	{
-	  if (sharemode == OF_SHARE_COMPAT) goto fail_int24;
-	  goto fail_error05;
-	}
-      switch (sharemode)
-	{
-	case OF_SHARE_COMPAT:
-	  goto fail_int24;
-	case OF_SHARE_DENY_NONE: 
-	  return FALSE;
-	case OF_SHARE_DENY_WRITE:
-	  if (oldopenmode == OF_READ) return FALSE;
-	case OF_SHARE_DENY_READ:
-	  if (oldopenmode == OF_WRITE) return FALSE;
-	case OF_SHARE_EXCLUSIVE:
-	default:
-	  goto fail_error05;
-	}
-      break;
-    case OF_SHARE_DENY_NONE:
-      switch (sharemode)
-	{
-	case OF_SHARE_COMPAT:
-	  goto fail_int24;
-	case OF_SHARE_DENY_NONE: 
-	  return FALSE;
-	case OF_SHARE_DENY_WRITE:
-	  if (oldopenmode == OF_READ) return FALSE;
-	case OF_SHARE_DENY_READ:
-	  if (oldopenmode == OF_WRITE) return FALSE;
-	case OF_SHARE_EXCLUSIVE:
-	default:
-	  goto fail_error05;
-	}
-    default:
-      ERR("unknown mode\n");
+        int ret = FILE_toupper(*str1) - FILE_toupper(*str2);
+        if (ret || !*str1) return ret;
+        str1++;
+        str2++;
     }
-  ERR("shouldn't happen\n");
-  ERR("Please report to bon@elektron.ikp.physik.tu-darmstadt.de\n");
-  return TRUE;
-  
-test_ro_int24:
-  if (oldmode == OF_READ)
-    return FALSE;
-  /* Fall through */
-fail_int24:
-  FIXME("generate INT24 missing\n");
-  /* Is this the right error? */
-  SetLastError( ERROR_ACCESS_DENIED );
-  return TRUE;
-  
-test_ro_err05:
-  if (oldmode == OF_READ)
-    return FALSE;
-  /* fall through */
-fail_error05:
-  TRACE("Access Denied, oldmode 0x%02x mode 0x%02x\n",oldmode,mode);
-  SetLastError( ERROR_ACCESS_DENIED );
-  return TRUE;
 }
-#endif
+
+
+/***********************************************************************
+ *              FILE_strncasecmp
+ *
+ * locale-independent case conversion for file I/O
+ */
+int FILE_strncasecmp( const char *str1, const char *str2, int len )
+{
+    int ret = 0;
+    for ( ; len > 0; len--, str1++, str2++)
+        if ((ret = FILE_toupper(*str1) - FILE_toupper(*str2)) || !*str1) break;
+    return ret;
+}
 
 
 /***********************************************************************
diff --git a/if1632/builtin.c b/if1632/builtin.c
index 54c3403..af5d782 100644
--- a/if1632/builtin.c
+++ b/if1632/builtin.c
@@ -13,6 +13,7 @@
 #include "builtin16.h"
 #include "global.h"
 #include "heap.h"
+#include "file.h"
 #include "module.h"
 #include "miscemu.h"
 #include "stackframe.h"
@@ -127,7 +128,7 @@
         const BUILTIN16_DESCRIPTOR *descr = builtin_dlls[i];
         NE_MODULE *pModule = (NE_MODULE *)descr->module_start;
         OFSTRUCT *pOfs = (OFSTRUCT *)((LPBYTE)pModule + pModule->fileinfo);
-        if (!strcasecmp( pOfs->szPathName, dllname ))
+        if (!FILE_strcasecmp( pOfs->szPathName, dllname ))
             return BUILTIN_DoLoadModule16( descr );
     }
 
@@ -138,7 +139,7 @@
             const BUILTIN16_DESCRIPTOR *descr = builtin_dlls[i];
             NE_MODULE *pModule = (NE_MODULE *)descr->module_start;
             OFSTRUCT *pOfs = (OFSTRUCT *)((LPBYTE)pModule + pModule->fileinfo);
-            if (!strcasecmp( pOfs->szPathName, dllname ))
+            if (!FILE_strcasecmp( pOfs->szPathName, dllname ))
                 return BUILTIN_DoLoadModule16( descr );
         }
         ERR( "loaded .so but dll %s still not found\n", dllname );
diff --git a/include/file.h b/include/file.h
index 3a22525..cc6de40 100644
--- a/include/file.h
+++ b/include/file.h
@@ -30,8 +30,21 @@
     int flags;
 } DOS_DEVICE;
 
+/* locale-independent case conversion */
+inline static char FILE_tolower( char c )
+{
+    if (c >= 'A' && c <= 'Z') c += 32;
+    return c;
+}
+inline static char FILE_toupper( char c )
+{
+    if (c >= 'a' && c <= 'z') c -= 32;
+    return c;
+}
 
 /* files/file.c */
+extern int FILE_strcasecmp( const char *str1, const char *str2 );
+extern int FILE_strncasecmp( const char *str1, const char *str2, int len );
 extern void FILE_SetDosError(void);
 extern HFILE FILE_DupUnixHandle( int fd, DWORD access );
 extern int FILE_GetUnixHandle( HANDLE handle, DWORD access );
diff --git a/loader/elf.c b/loader/elf.c
index e733ad6..e0f2e3a 100644
--- a/loader/elf.c
+++ b/loader/elf.c
@@ -19,6 +19,7 @@
 #include "snoop.h"
 #include "process.h"
 #include "heap.h"
+#include "file.h"
 #include "module.h"
 #include "debugtools.h"
 #include "winerror.h"
@@ -133,7 +134,7 @@
 	s = strchr(x,'.');
 	if (s) {
             while (s) {
-		if (!strcasecmp(s,".dll")) {
+		if (!FILE_strcasecmp(s,".dll")) {
                     strcpy(s+1,UNIX_DLL_ENDING);
                     break;
 		}
diff --git a/loader/loadorder.c b/loader/loadorder.c
index 87680bf..d5750a7 100644
--- a/loader/loadorder.c
+++ b/loader/loadorder.c
@@ -13,6 +13,7 @@
 #include "options.h"
 #include "loadorder.h"
 #include "heap.h"
+#include "file.h"
 #include "module.h"
 #include "elfdll.h"
 #include "debugtools.h"
@@ -98,7 +99,8 @@
  */
 static int cmp_sort_func(const void *s1, const void *s2)
 {
-	return strcasecmp(((module_loadorder_t *)s1)->modulename, ((module_loadorder_t *)s2)->modulename);
+    return FILE_strcasecmp(((module_loadorder_t *)s1)->modulename,
+                           ((module_loadorder_t *)s2)->modulename);
 }
 
 
@@ -262,7 +264,8 @@
 		char *ext = strrchr(cptr, '.');
 		if(ext)
 		{
-			if(strlen(ext) == 4 && (!strcasecmp(ext, ".dll") || !strcasecmp(ext, ".exe")))
+			if(strlen(ext) == 4 &&
+                           (!FILE_strcasecmp(ext, ".dll") || !FILE_strcasecmp(ext, ".exe")))
 				MESSAGE("Warning: Loadorder override '%s' contains an extension and might not be found during lookup\n", cptr);
 		}
 
@@ -504,7 +507,7 @@
 
 	/* Strip path information for 16 bit modules or if the module 
 	   resides in the system directory */
-	if ( !win32 || !strncasecmp ( sysdir, path, strlen (sysdir) ) )
+	if ( !win32 || !FILE_strncasecmp ( sysdir, path, strlen (sysdir) ) )
 	{
 	
 	    cptr = strrchr(path, '\\');
@@ -532,7 +535,7 @@
 	}
 
 	strcpy(fname, name);
-	if(len >= 4 && (!strcasecmp(fname+len-4, ".dll") || !strcasecmp(fname+len-4, ".exe")))
+	if(len >= 4 && (!FILE_strcasecmp(fname+len-4, ".dll") || !FILE_strcasecmp(fname+len-4, ".exe")))
 		fname[len-4] = '\0';
 
 	lo.modulename = fname;
diff --git a/loader/module.c b/loader/module.c
index e845783..7434ca6 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -14,6 +14,7 @@
 #include "wine/winbase16.h"
 #include "winerror.h"
 #include "heap.h"
+#include "file.h"
 #include "process.h"
 #include "selectors.h"
 #include "debugtools.h"
@@ -433,13 +434,13 @@
 
     for ( wm = PROCESS_Current()->modref_list; wm; wm = wm->next )
     {
-        if ( !strcasecmp( dllname, wm->modname ) )
+        if ( !FILE_strcasecmp( dllname, wm->modname ) )
             break;
-        if ( !strcasecmp( dllname, wm->filename ) )
+        if ( !FILE_strcasecmp( dllname, wm->filename ) )
             break;
-        if ( !strcasecmp( dllname, wm->short_modname ) )
+        if ( !FILE_strcasecmp( dllname, wm->short_modname ) )
             break;
-        if ( !strcasecmp( dllname, wm->short_filename ) )
+        if ( !FILE_strcasecmp( dllname, wm->short_filename ) )
             break;
     }
 
@@ -631,13 +632,13 @@
     ptr = strrchr( filename, '.' );
     if ( ptr && !strchr( ptr, '\\' ) && !strchr( ptr, '/' ) )
     {
-        if ( !strcasecmp( ptr, ".COM" ) )
+        if ( !FILE_strcasecmp( ptr, ".COM" ) )
         {
             *lpBinaryType = SCS_DOS_BINARY;
             return TRUE;
         }
 
-        if ( !strcasecmp( ptr, ".PIF" ) )
+        if ( !FILE_strcasecmp( ptr, ".PIF" ) )
         {
             *lpBinaryType = SCS_PIF_BINARY;
             return TRUE;
@@ -1304,7 +1305,7 @@
 	       if the library name does not contain a path and can not be found, assume the 
 	       system directory is meant */
 	    
-	    if ( ! strncasecmp ( filename, libname, strlen ( filename ) ))
+	    if ( ! FILE_strncasecmp ( filename, libname, strlen ( filename ) ))
 	        strcpy ( filename, libname );
 	    else
 	    {
diff --git a/loader/ne/module.c b/loader/ne/module.c
index 81aa3ed..e8c2908 100644
--- a/loader/ne/module.c
+++ b/loader/ne/module.c
@@ -252,8 +252,8 @@
       /* Now copy and uppercase the string */
 
     strcpy( buffer, name );
-    _strupr( buffer );
-    len = strlen( buffer );
+    for (cpnt = buffer; *cpnt; cpnt++) *cpnt = FILE_toupper(*cpnt);
+    len = cpnt - buffer;
 
       /* First search the resident names */
 
@@ -1466,8 +1466,7 @@
     /* If uppercased 'name' matches exactly the module name of a module:
      * Return its handle
      */
-    for (s = tmpstr; *s; s++)
-    	*s = toupper(*s);
+    for (s = tmpstr; *s; s++) *s = FILE_toupper(*s);
 
     for (hModule = hFirstModule; hModule ; hModule = pModule->next)
     {
@@ -1482,7 +1481,7 @@
 	 * 'i' compare is just a quickfix until the loader handles that
 	 * correctly. -MM 990705
 	 */
-        if ((*name_table == len) && !strncasecmp(tmpstr, name_table+1, len))
+        if ((*name_table == len) && !FILE_strncasecmp(tmpstr, name_table+1, len))
             return hModule;
     }
 
@@ -1521,7 +1520,7 @@
 	    loadedfn--;
 	}
 	/* case insensitive compare ... */
-	if (!strcasecmp(loadedfn, s))
+	if (!FILE_strcasecmp(loadedfn, s))
 	    return hModule;
     }
 
@@ -1529,7 +1528,7 @@
      * matches the base filename of the module filename of some 32-bit module:
      * Return the corresponding 16-bit dummy module handle. 
      */
-    if (len >= 4 && !strcasecmp(name+len-4, ".EXE"))
+    if (len >= 4 && !FILE_strcasecmp(name+len-4, ".EXE"))
     {
         HMODULE hModule = GetModuleHandleA( name );
         if ( hModule )
@@ -1596,10 +1595,9 @@
 	    loadedfn--;
 	}
 	/* case insensitive compare ... */
-	if (!strcasecmp(loadedfn, s))
+	if (!FILE_strcasecmp(loadedfn, s))
 	    return hModule;
     }
-
     /* If basename (without ext) matches the module name of a module:
      * Return its handle.
      */
@@ -1614,7 +1612,7 @@
         if (pModule->flags & NE_FFLAGS_WIN32) continue;
 
         name_table = (BYTE *)pModule + pModule->name_table;
-        if ((*name_table == len) && !strncasecmp(s, name_table+1, len))
+        if ((*name_table == len) && !FILE_strncasecmp(s, name_table+1, len))
             return hModule;
     }
 
