Convert to unix line endings.
[wincetools.git] / loader / kernel32_module.c
1 /* From wine1.2-1.1.42/dlls/kernel32/module.c  */
2
3 /*
4  * Modules
5  *
6  * Copyright 1995 Alexandre Julliard
7  * Copyright 2010 g10 Code GmbH
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23
24
25 #include "wine.h"
26 #include "kernel32_kernel_private.h"
27
28
29 void MODULE_get_binary_info (HANDLE hfile, struct binary_info *info)
30 {
31   union
32   {
33     IMAGE_DOS_HEADER mz;
34   } header;
35   
36   DWORD len;
37
38   memset( info, 0, sizeof(*info) );
39   /* Seek to the start of the file and read the header information. */
40   if (SetFilePointer( hfile, 0, NULL, SEEK_SET ) == -1) return;
41   if (!ReadFile( hfile, &header, sizeof(header), &len, NULL ) || len != sizeof(header)) return;
42   
43   if (header.mz.e_magic == IMAGE_DOS_SIGNATURE)
44     {
45       union
46       {
47         IMAGE_OS2_HEADER os2;
48         IMAGE_NT_HEADERS32 nt;
49       } ext_header;
50       
51       /* We do have a DOS image so we will now try to seek into
52        * the file by the amount indicated by the field
53        * "Offset to extended header" and read in the
54        * "magic" field information at that location.
55        * This will tell us if there is more header information
56        * to read or not.
57        */
58       info->type = BINARY_DOS;
59       if (SetFilePointer( hfile, header.mz.e_lfanew, NULL, SEEK_SET ) == -1) return;
60       if (!ReadFile( hfile, &ext_header, sizeof(ext_header), &len, NULL ) || len < 4) return;
61       
62       /* Reading the magic field succeeded so
63        * we will try to determine what type it is.
64        */
65       if (!memcmp( &ext_header.nt.Signature, "PE\0\0", 4 ))
66         {
67           if (len >= sizeof(ext_header.nt.FileHeader))
68             {
69               info->type = BINARY_PE;
70               if (ext_header.nt.FileHeader.Characteristics & IMAGE_FILE_DLL)
71                 info->flags |= BINARY_FLAG_DLL;
72               if (len < sizeof(ext_header.nt))  /* clear remaining part of header if missing */
73                 memset( (char *)&ext_header.nt + len, 0, sizeof(ext_header.nt) - len );
74               switch (ext_header.nt.OptionalHeader.Magic)
75                 {
76                 case IMAGE_NT_OPTIONAL_HDR32_MAGIC:
77                   info->res_start = (void *)(ULONG_PTR)ext_header.nt.OptionalHeader.ImageBase;
78                   info->res_end = (void *)((ULONG_PTR)ext_header.nt.OptionalHeader.ImageBase +
79                                            ext_header.nt.OptionalHeader.SizeOfImage);
80                   break;
81                 case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
82                   info->flags |= BINARY_FLAG_64BIT;
83                   break;
84                 } 
85
86               info->machine = ext_header.nt.FileHeader.Machine;
87            }
88         }
89     }
90 }
91
92 \f
93 static HMODULE load_library( LPCWSTR libname, DWORD flags )
94 {
95   NTSTATUS nts;
96   HMODULE hModule;
97
98   /* We don't use any special DLL load path.  */
99
100   if (flags & LOAD_LIBRARY_AS_DATAFILE)
101     {
102       SetLastError(ERROR_INVALID_PARAMETER);
103       return NULL;
104     }
105
106   nts = MyLdrLoadDll( NULL, flags, libname, &hModule );
107   if (nts != STATUS_SUCCESS)
108     {
109       hModule = 0;
110       SetLastError( MyRtlNtStatusToDosError( nts ) );
111     }
112   return hModule;
113 }
114
115
116 HMODULE MyLoadLibraryExW(LPCWSTR libnameW, HANDLE hfile, DWORD flags)
117 {
118 /* We would like to use the native LoadLibraryEx, but on Windows CE
119    that is only implemented for DLLs.  Also, base addresses are
120    restricted to the process slot, but we want to load at high
121    addresses.  */
122   TRACE ("MyLoadLibraryExW (\"%S\", 0x%p, 0x%x)\n", libnameW, hfile, flags);
123   if (!libnameW)
124     {
125       SetLastError(ERROR_INVALID_PARAMETER);
126       return 0;
127     }
128   return load_library( libnameW, flags );
129 }