source: trunk/src/win32k/ldr/myldrOpenPath.cpp@ 3830

Last change on this file since 3830 was 3829, checked in by bird, 25 years ago

Early development.

File size: 6.1 KB
Line 
1/* $Id: myldrOpenPath.cpp,v 1.1 2000-07-16 22:21:16 bird Exp $
2 *
3 * myldrOpenPath - ldrOpenPath used to open executables we'll override
4 * this to altern the search path for DLLs.
5 *
6 * Copyright (c) 2000 knut st. osmundsen (knut.stange.osmundsen@pmsc.no)
7 *
8 * Project Odin Software License can be found in LICENSE.TXT
9 *
10 */
11
12/*******************************************************************************
13* Defined Constants And Macros *
14*******************************************************************************/
15#define INCL_DOSERRORS
16#define INCL_NOPMAPI
17#define INCL_OS2KRNL_TCB
18
19/*******************************************************************************
20* Header Files *
21*******************************************************************************/
22#include <os2.h>
23
24#include <memory.h>
25#include <stdlib.h>
26
27#include "log.h"
28#include "dev32.h"
29#include "dev32hlp.h"
30#include <peexe.h>
31#include <exe386.h>
32#include "OS2Krnl.h"
33#include "avl.h"
34#include "ldrCalls.h"
35#include "ldr.h"
36#include "ModuleBase.h"
37
38
39
40/**
41 * myldrOpenPath - opens file eventually searching loader specific paths
42 *
43 * @returns OS2 return code.
44 * plv->lv_sfn is set to filename handle.
45 * @param pachFilename Pointer to modulename. Not zero terminated!
46 * @param cchFilename Modulename length.
47 * @param plv Loader local variables? (Struct from KERNEL.SDF)
48 * @param pful Pointer to flags which are passed on to ldrOpen.
49 * @sketch
50 * This is roughly what the original ldrOpenPath does:
51 * Save pTCBCur->TCBFailErr.
52 * if !CLASS_GLOBAL or miniifs then
53 * ldrOpen(pachFilename)
54 * else
55 * loop until no more libpath elements
56 * get next libpath element and add it to the modname.
57 * try open the modname
58 * if successfull then break the loop.
59 * endloop
60 * endif
61 * Restore pTCBCur->TCBFailErr.
62 * @remark This function will change the "Loader state".
63 *
64 */
65ULONG LDRCALL myldrOpenPath( /* retd 0x10 */
66 PCHAR pachFilename, /* ebp + 0x08 */
67 USHORT cchFilename, /* ebp + 0x0c */
68 ldrlv_t * plv, /* ebp + 0x10 */
69 PULONG pful /* ebp + 0x14 */
70 )
71{
72
73 APIRET rc;
74
75 #ifdef DEBUG
76 /* !paranoia!
77 * Check that the passed in parameters are valid.
78 * If they aren't we'll log this situation and forward the call to ldrOpenPath.
79 */
80 if ((unsigned)pachFilename < 0x10000
81 || (unsigned)plv < 0x10000
82 || cchFilename == 0
83 || cchFilename >= CCHMAXPATH)
84 {
85 kprintf(("myldrOpenPath: Invalid parameters!!!!\n"
86 " pachFilename 0x%08x cchFilename 0x%04x plv 0x%08x pful=0x%08x\n",
87 pachFilename, cchFilename, plv, pful
88 ));
89 return ldrOpenPath(pachFilename, cchFilename, plv, pful);
90 }
91 #endif
92
93
94 /*
95 * We'll check what type of image being opned and save that piece of
96 * information for use in (my)ldrOpen.
97 */
98 if (plv->lv_type == LVTYPE_EXE)
99 setLdrStateLoadingEXE();
100 else if (plv->lv_type == LVTYPE_DLL)
101 setLdrStateLoadingDLL();
102 else
103 setLdrStateLoadingUnsupported();
104
105 /*
106 * Overload the behaviour of ldrOpenPath?
107 * - Currently only for DLL loading into the GLOBAL class
108 */
109 if (isLdrStateLoadingDLL()
110 && (plv->lv_class == CLASS_GLOBAL || plv->lv_class == CLASS_ALL))
111 {
112 /*
113 * If the executable being loaded is one of our executables we'll
114 * use our method for finding dynamic link libraries.
115 *
116 * At tkExecPgm time this is quite easy. The executable must have been
117 * opened allready and the OUREXE flag will be set if it's one of our
118 * executables.
119 *
120 * At non-tkExecPgm time it's a bit more difficult. We'll have to get
121 * the local infosegment for the process/thread running and check
122 * if the executable (EXE) hMTE is one of ours. We'll do a lookup in
123 * the AVL tree.
124 *
125 * In both cases the result will have to be a module pointer which we
126 * will invoke the overriding ldrOpenPath by.
127 */
128 PMODULE pExe = NULL; /* Pointer to executable which we're to invoke ldrOpenPath by. */
129 if (isLdrStateExecPgm())
130 {
131 if (isLdrStateLoadingOurEXE())
132 pExe = pExeModule;
133 }
134 else
135 {
136 struct InfoSegLDT *pInfoSeg;
137 pInfoSeg = (struct InfoSegLDT *)D32Hlp_GetDOSVar(DHGETDOSV_SYSINFOSEG, 0);
138 if (pInfoSeg == NULL)
139 {
140 pExe = getModuleByhMTE(pInfoSeg->LIS_DI); /* LIS_DI is the same as hmod in LINFOSEG from bsedos16.h. */
141 #ifdef DEBUG /* While testing! */
142 kprintf(("myldrOpenPath: getModuleByhMTE returned 0x%x08 for hmod=0x%04\n",
143 pExe, pInfoSeg->LIS_DI));
144 #endif
145 }
146 #ifdef DEBUG /* While testing! */
147 else
148 dprintf(("myldrOpenPath: D32Hlp_GetDOSVar(DHGETDOSV_SYSINFOSEG) failed.\n"));
149 #endif
150 }
151
152 /*
153 * If executable module was found the invoke the overriding ldrOpenPath function.
154 */
155 if (pExe != NULL)
156 {
157 /* We'll have to save the TCBFailErr since we don't want to cause
158 * Hard Errors while searching invalid paths, etc. (ldrOpenPath does this!)
159 */
160 USHORT TCBFailErr_save = tcbGetTCBFailErr(tcbGetCur());
161 rc = pExe->Data.pModule->openPath(pachFilename, cchFilename, plv, pful);
162 tcbSetTCBFailErr(tcbGetCur(), TCBFailErr_save);
163 }
164 else
165 rc = ldrOpenPath(pachFilename, cchFilename, plv, pful);
166 }
167 else
168 rc = ldrOpenPath(pachFilename, cchFilename, plv, pful);
169
170
171 /*
172 * Change Loader State - Clear the type part of the loading bits.
173 */
174 setLdrStateClearLoadingType();
175
176 return rc;
177}
178
179
180
Note: See TracBrowser for help on using the repository browser.