First version of DLL preloader.
[wincetools.git] / loader / kernel32_module.c
index fcc096d..7390f27 100644 (file)
-/* From wine1.2-1.1.42/dlls/kernel32/module.c  */
-
-/*
- * Modules
- *
- * Copyright 1995 Alexandre Julliard
- * Copyright 2010 g10 Code GmbH
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-
-#include "himemce.h"
-#include "kernel32_kernel_private.h"
-
-
-void MODULE_get_binary_info (HANDLE hfile, struct binary_info *info)
-{
-  union
-  {
-    IMAGE_DOS_HEADER mz;
-  } header;
-  
-  DWORD len;
-
-  memset( info, 0, sizeof(*info) );
-  /* Seek to the start of the file and read the header information. */
-  if (SetFilePointer( hfile, 0, NULL, SEEK_SET ) == -1) return;
-  if (!ReadFile( hfile, &header, sizeof(header), &len, NULL ) || len != sizeof(header)) return;
-  
-  if (header.mz.e_magic == IMAGE_DOS_SIGNATURE)
-    {
-      union
-      {
-       IMAGE_OS2_HEADER os2;
-       IMAGE_NT_HEADERS32 nt;
-      } ext_header;
-      
-      /* We do have a DOS image so we will now try to seek into
-       * the file by the amount indicated by the field
-       * "Offset to extended header" and read in the
-       * "magic" field information at that location.
-       * This will tell us if there is more header information
-       * to read or not.
-       */
-      info->type = BINARY_DOS;
-      if (SetFilePointer( hfile, header.mz.e_lfanew, NULL, SEEK_SET ) == -1) return;
-      if (!ReadFile( hfile, &ext_header, sizeof(ext_header), &len, NULL ) || len < 4) return;
-      
-      /* Reading the magic field succeeded so
-       * we will try to determine what type it is.
-       */
-      if (!memcmp( &ext_header.nt.Signature, "PE\0\0", 4 ))
-        {
-         if (len >= sizeof(ext_header.nt.FileHeader))
-            {
-             info->type = BINARY_PE;
-             if (ext_header.nt.FileHeader.Characteristics & IMAGE_FILE_DLL)
-               info->flags |= BINARY_FLAG_DLL;
-             if (len < sizeof(ext_header.nt))  /* clear remaining part of header if missing */
-               memset( (char *)&ext_header.nt + len, 0, sizeof(ext_header.nt) - len );
-             switch (ext_header.nt.OptionalHeader.Magic)
-                {
-                case IMAGE_NT_OPTIONAL_HDR32_MAGIC:
-                 info->res_start = (void *)(ULONG_PTR)ext_header.nt.OptionalHeader.ImageBase;
-                 info->res_end = (void *)((ULONG_PTR)ext_header.nt.OptionalHeader.ImageBase +
-                                          ext_header.nt.OptionalHeader.SizeOfImage);
-                 break;
-                case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
-                 info->flags |= BINARY_FLAG_64BIT;
-                 break;
-                }
-            }
-        }
-    }
-}
-
-\f
-static HMODULE load_library( LPCWSTR libname, DWORD flags )
-{
-  NTSTATUS nts;
-  HMODULE hModule;
-
-  /* We don't use any special DLL load path.  */
-
-  if (flags & LOAD_LIBRARY_AS_DATAFILE)
-    {
-      SetLastError(ERROR_INVALID_PARAMETER);
-      return NULL;
-    }
-
-  nts = MyLdrLoadDll( NULL, flags, libname, &hModule );
-  if (nts != STATUS_SUCCESS)
-    {
-      hModule = 0;
-      SetLastError( MyRtlNtStatusToDosError( nts ) );
-    }
-  return hModule;
-}
-
-
-HMODULE MyLoadLibraryExW(LPCWSTR libnameW, HANDLE hfile, DWORD flags)
-{
-/* We would like to use the native LoadLibraryEx, but on Windows CE
-   that is only implemented for DLLs.  Also, base addresses are
-   restricted to the process slot, but we want to load at high
-   addresses.  */
-  TRACE ("MyLoadLibraryExW (\"%S\", 0x%p, 0x%x)\n", libnameW, hfile, flags);
-  if (!libnameW)
-    {
-      SetLastError(ERROR_INVALID_PARAMETER);
-      return 0;
-    }
-  return load_library( libnameW, flags );
-}
+/* From wine1.2-1.1.42/dlls/kernel32/module.c  */\r
+\r
+/*\r
+ * Modules\r
+ *\r
+ * Copyright 1995 Alexandre Julliard\r
+ * Copyright 2010 g10 Code GmbH\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
+\r
+\r
+#include "wine.h"\r
+#include "kernel32_kernel_private.h"\r
+\r
+\r
+void MODULE_get_binary_info (HANDLE hfile, struct binary_info *info)\r
+{\r
+  union\r
+  {\r
+    IMAGE_DOS_HEADER mz;\r
+  } header;\r
+  \r
+  DWORD len;\r
+\r
+  memset( info, 0, sizeof(*info) );\r
+  /* Seek to the start of the file and read the header information. */\r
+  if (SetFilePointer( hfile, 0, NULL, SEEK_SET ) == -1) return;\r
+  if (!ReadFile( hfile, &header, sizeof(header), &len, NULL ) || len != sizeof(header)) return;\r
+  \r
+  if (header.mz.e_magic == IMAGE_DOS_SIGNATURE)\r
+    {\r
+      union\r
+      {\r
+       IMAGE_OS2_HEADER os2;\r
+       IMAGE_NT_HEADERS32 nt;\r
+      } ext_header;\r
+      \r
+      /* We do have a DOS image so we will now try to seek into\r
+       * the file by the amount indicated by the field\r
+       * "Offset to extended header" and read in the\r
+       * "magic" field information at that location.\r
+       * This will tell us if there is more header information\r
+       * to read or not.\r
+       */\r
+      info->type = BINARY_DOS;\r
+      if (SetFilePointer( hfile, header.mz.e_lfanew, NULL, SEEK_SET ) == -1) return;\r
+      if (!ReadFile( hfile, &ext_header, sizeof(ext_header), &len, NULL ) || len < 4) return;\r
+      \r
+      /* Reading the magic field succeeded so\r
+       * we will try to determine what type it is.\r
+       */\r
+      if (!memcmp( &ext_header.nt.Signature, "PE\0\0", 4 ))\r
+        {\r
+         if (len >= sizeof(ext_header.nt.FileHeader))\r
+            {\r
+             info->type = BINARY_PE;\r
+             if (ext_header.nt.FileHeader.Characteristics & IMAGE_FILE_DLL)\r
+               info->flags |= BINARY_FLAG_DLL;\r
+             if (len < sizeof(ext_header.nt))  /* clear remaining part of header if missing */\r
+               memset( (char *)&ext_header.nt + len, 0, sizeof(ext_header.nt) - len );\r
+             switch (ext_header.nt.OptionalHeader.Magic)\r
+                {\r
+                case IMAGE_NT_OPTIONAL_HDR32_MAGIC:\r
+                 info->res_start = (void *)(ULONG_PTR)ext_header.nt.OptionalHeader.ImageBase;\r
+                 info->res_end = (void *)((ULONG_PTR)ext_header.nt.OptionalHeader.ImageBase +\r
+                                          ext_header.nt.OptionalHeader.SizeOfImage);\r
+                 break;\r
+                case IMAGE_NT_OPTIONAL_HDR64_MAGIC:\r
+                 info->flags |= BINARY_FLAG_64BIT;\r
+                 break;\r
+                } \r
+\r
+             info->machine = ext_header.nt.FileHeader.Machine;\r
+           }\r
+        }\r
+    }\r
+}\r
+\r
+\f\r
+static HMODULE load_library( LPCWSTR libname, DWORD flags )\r
+{\r
+  NTSTATUS nts;\r
+  HMODULE hModule;\r
+\r
+  /* We don't use any special DLL load path.  */\r
+\r
+  if (flags & LOAD_LIBRARY_AS_DATAFILE)\r
+    {\r
+      SetLastError(ERROR_INVALID_PARAMETER);\r
+      return NULL;\r
+    }\r
+\r
+  nts = MyLdrLoadDll( NULL, flags, libname, &hModule );\r
+  if (nts != STATUS_SUCCESS)\r
+    {\r
+      hModule = 0;\r
+      SetLastError( MyRtlNtStatusToDosError( nts ) );\r
+    }\r
+  return hModule;\r
+}\r
+\r
+\r
+HMODULE MyLoadLibraryExW(LPCWSTR libnameW, HANDLE hfile, DWORD flags)\r
+{\r
+/* We would like to use the native LoadLibraryEx, but on Windows CE\r
+   that is only implemented for DLLs.  Also, base addresses are\r
+   restricted to the process slot, but we want to load at high\r
+   addresses.  */\r
+  TRACE ("MyLoadLibraryExW (\"%S\", 0x%p, 0x%x)\n", libnameW, hfile, flags);\r
+  if (!libnameW)\r
+    {\r
+      SetLastError(ERROR_INVALID_PARAMETER);\r
+      return 0;\r
+    }\r
+  return load_library( libnameW, flags );\r
+}\r