source: trunk/src/kernel32/winimagelx.cpp@ 3993

Last change on this file since 3993 was 3993, checked in by sandervl, 25 years ago

Updates for fake system dll headers

File size: 7.1 KB
Line 
1/* $Id: winimagelx.cpp,v 1.9 2000-08-11 10:56:19 sandervl Exp $ */
2
3/*
4 * Win32 LX Image base class
5 *
6 * Copyright 1999-2000 Sander van Leeuwen (sandervl@xs4all.nl)
7 *
8 * TODO: headers not complete
9 *
10 * Project Odin Software License can be found in LICENSE.TXT
11 *
12 */
13
14#define INCL_DOSFILEMGR /* File Manager values */
15#define INCL_DOSMODULEMGR
16#define INCL_DOSERRORS /* DOS Error values */
17#define INCL_DOSPROCESS /* DOS Process values */
18#define INCL_DOSMISC /* DOS Miscellanous values */
19#define INCL_WIN
20#define INCL_BASE
21#include <os2wrap.h> //Odin32 OS/2 api wrappers
22
23#include <stdio.h>
24#include <string.h>
25#include <stdlib.h>
26
27#include <assert.h>
28#include <misc.h>
29#include <win32type.h>
30#include <winimagebase.h>
31#include <winimagelx.h>
32#include <windllbase.h>
33#include <winexebase.h>
34#include <winexelx.h>
35#include <pefile.h>
36#include <unicode.h>
37#include "oslibmisc.h"
38#include "initterm.h"
39#include <win\virtual.h>
40
41#define DBG_LOCALLOG DBG_winimagelx
42#include "dbglocal.h"
43
44static BYTE dosHeader[] = {
45 0x4D, 0x5A, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x0B, 0x00,
46 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
47 0x6A, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
48 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00,
49 0xB4, 0x30, 0xCD, 0x21, 0x86, 0xC4, 0x3D, 0x0A, 0x14, 0x72, 0x42, 0xBE, 0x80, 0x00, 0x8A, 0x1C,
50 0x32, 0xFF, 0x46, 0x88, 0x38, 0x2E, 0x8C, 0x1E, 0x6E, 0x00, 0x8E, 0x06, 0x2C, 0x00, 0x33, 0xC0,
51 0x8B, 0xF8, 0xB9, 0x00, 0x80, 0xFC, 0xF2, 0xAE, 0x75, 0x23, 0x49, 0x78, 0x20, 0xAE, 0x75, 0xF6,
52 0x47, 0x47, 0x0E, 0x1F, 0x2E, 0x89, 0x3E, 0x68, 0x00, 0x2E, 0x8C, 0x06, 0x6A, 0x00, 0xBE, 0x5C,
53 0x00, 0xB9, 0x6C, 0x63, 0xBB, 0x25, 0x00, 0xB4, 0x64, 0xCD, 0x21, 0x73, 0x0B, 0xBA, 0x7C, 0x00,
54 0x0E, 0x1F, 0xB4, 0x09, 0xCD, 0x21, 0xB0, 0x01, 0xB4, 0x4C, 0xCD, 0x21, 0x20, 0x00, 0x01, 0x00,
55 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00,
56 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x54, 0x68, 0x69, 0x73,
57 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x6D, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65,
58 0x20, 0x72, 0x75, 0x6E, 0x20, 0x75, 0x6E, 0x64, 0x65, 0x72, 0x20, 0x57, 0x69, 0x6E, 0x33, 0x32,
59 0x2E, 0x0D, 0x0A, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
60};
61
62//******************************************************************************
63//******************************************************************************
64Win32LxImage::Win32LxImage(HINSTANCE hInstance, PVOID pResData)
65 : Win32ImageBase(hInstance), header(0)
66{
67 APIRET rc;
68
69 szFileName[0] = 0;
70
71 char *name = OSLibGetDllName(hinstance);
72 strcpy(szFileName, name);
73 strupr(szFileName);
74
75 setFullPath(szFileName);
76
77 //Pointer to PE resource tree generates by wrc (or NULL for system dlls)
78 pResRootDir = (PIMAGE_RESOURCE_DIRECTORY)pResData;
79
80 //ulRVAResourceSection contains the virtual address of the imagebase in the PE header
81 //for the resource section (images loaded by the pe.exe)
82 //For LX images, this is 0 as OffsetToData contains a relative offset
83 ulRVAResourceSection = 0;
84}
85//******************************************************************************
86//******************************************************************************
87Win32LxImage::~Win32LxImage()
88{
89 if(header) {
90 DosFreeMem(header);
91 }
92}
93//******************************************************************************
94//******************************************************************************
95ULONG Win32LxImage::getApi(char *name)
96{
97 APIRET rc;
98 ULONG apiaddr;
99
100 rc = DosQueryProcAddr(hinstanceOS2, 0, name, (PFN *)&apiaddr);
101 if(rc)
102 {
103 dprintf(("Win32LxImage::getApi -> rc = %d", rc));
104 return(0);
105 }
106 return(apiaddr);
107}
108//******************************************************************************
109//******************************************************************************
110ULONG Win32LxImage::getApi(int ordinal)
111{
112 APIRET rc;
113 ULONG apiaddr;
114
115 rc = DosQueryProcAddr(hinstanceOS2, ordinal, NULL, (PFN *)&apiaddr);
116 if(rc) {
117 dprintf(("Win32LxImage::getApi -> rc = %d", rc));
118 return(0);
119 }
120 return(apiaddr);
121}
122//******************************************************************************
123//******************************************************************************
124LPVOID Win32LxImage::buildHeader(DWORD MajorImageVersion, DWORD MinorImageVersion,
125 DWORD Subsystem)
126{
127 APIRET rc;
128 IMAGE_DOS_HEADER *pdosheader;
129 PIMAGE_OPTIONAL_HEADER poh;
130 PIMAGE_FILE_HEADER pfh;
131 DWORD *ntsig;
132
133 rc = DosAllocMem(&header, 4096, PAG_READ | PAG_WRITE | PAG_COMMIT);
134 if(rc) {
135 dprintf(("ERROR: buildHeader DosAllocMem failed!! (rc=%x)", rc));
136 DebugInt3();
137 return NULL;
138 }
139 memcpy(header, dosHeader, sizeof(dosHeader));
140 ntsig = (DWORD *)((LPBYTE)header + sizeof(dosHeader));
141 *ntsig = IMAGE_NT_SIGNATURE;
142 pfh = (PIMAGE_FILE_HEADER)(ntsig+1);
143 pfh->Machine = IMAGE_FILE_MACHINE_I386;
144 pfh->NumberOfSections = 0;
145 pfh->TimeDateStamp = 0x3794f60f;
146 pfh->PointerToSymbolTable = 0;
147 pfh->NumberOfSymbols = 0;
148 pfh->SizeOfOptionalHeader = sizeof(IMAGE_OPTIONAL_HEADER);
149 pfh->Characteristics = IMAGE_FILE_DLL | IMAGE_FILE_32BIT_MACHINE |
150 IMAGE_FILE_DEBUG_STRIPPED | IMAGE_FILE_EXECUTABLE_IMAGE |
151 IMAGE_FILE_RELOCS_STRIPPED;
152 poh = (PIMAGE_OPTIONAL_HEADER)(pfh+1);
153 poh->Magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
154 poh->MajorLinkerVersion = 0x3;
155 poh->MinorLinkerVersion = 0xA;
156 poh->SizeOfCode = 0;
157 poh->SizeOfInitializedData = 0;
158 poh->SizeOfUninitializedData = 0;
159 poh->AddressOfEntryPoint = 0;
160 poh->BaseOfCode = 0;
161 poh->BaseOfData = 0;
162 poh->ImageBase = 0;
163 poh->SectionAlignment = 4096;
164 poh->FileAlignment = 512;
165 poh->MajorOperatingSystemVersion = MajorImageVersion;
166 poh->MinorOperatingSystemVersion = MinorImageVersion;
167 poh->MajorImageVersion = MajorImageVersion;
168 poh->MinorImageVersion = MinorImageVersion;
169 poh->MajorSubsystemVersion = ODINNT_MAJOR_VERSION;
170 poh->MinorSubsystemVersion = ODINNT_MINOR_VERSION;
171 poh->Reserved1 = 0;
172 poh->SizeOfImage = 0;
173 poh->SizeOfHeaders = 1024;
174 poh->CheckSum = 0;
175 poh->Subsystem = Subsystem;
176 poh->DllCharacteristics = 0;
177 poh->SizeOfStackReserve = 1*1024*1024;
178 poh->SizeOfStackCommit = 4096;
179 poh->SizeOfHeapReserve = 1*1024*1024;
180 poh->SizeOfHeapCommit = 4096;
181 poh->LoaderFlags = 0;
182 poh->NumberOfRvaAndSizes = 0;
183// poh->DataDirectory[0]
184
185 return header;
186}
187//******************************************************************************
188//******************************************************************************
Note: See TracBrowser for help on using the repository browser.