source: trunk/include/custombuild.h@ 10456

Last change on this file since 10456 was 10456, checked in by sandervl, 22 years ago

* empty log message *

File size: 18.1 KB
Line 
1#ifndef __CUSTOMBUILD_H__
2#define __CUSTOMBUILD_H__
3
4#include <win\peexe.h>
5#include <initdll.h>
6
7//HKEY_LOCAL_MACHINE
8#define CUSTOM_BUILD_OPTIONS_KEY "System\\CustomBuild"
9#define DISABLE_AUDIO_KEY "DisableAudio"
10#define DISABLE_ASPI_KEY "DisableASPI"
11
12#define ODIN_WIN32_CDCLASS "Win32CDWindowClass"
13#define ODIN_WIN32_STDCLASS "Win32WindowClass"
14
15#define DUMMY_PREFIX "DUMMY_"
16
17#define MAX_FONT_MAPPINGS 8
18#define MAX_REGISTER_DLLS 64
19
20#define INNOWIN_DLLNAME "INNOWIN.DLL"
21#define INNOWIN_REGISTRY_BASE "Software\\InnoTek\\INNOWIN\\"
22#define INNOWIN_REG_CURRENTUSER "REGROOT_HKEY_CurrentUser"
23#define INNOWIN_REG_LOCAL_MACHINE "REGROOT_HKEY_LocalMachine"
24#define INNOWIN_REG_USERS "REGROOT_HKEY_Users"
25
26#define MAKE_BUILDNR(major, minor) ((major << 16) | minor)
27#define MAJOR_BUILDNR(buildnr) (buildnr >> 16)
28#define MINOR_BUILDNR(buildnr) (buildnr & 0xffff)
29
30
31typedef BOOL (WIN32API *PFN_PRECUSTOMIZE)();
32typedef BOOL (WIN32API *PFN_POSTCUSTOMIZE)();
33typedef BOOL (WIN32API *PFN_ENDCUSTOMIZE)();
34typedef BOOL (WIN32API *PFN_ISPESTUBLOADER)(char *pszProgram);
35
36typedef struct {
37 char *szWindowsFont;
38 char *szPMFont;
39} CUSTOMBUILD_FONTMAP;
40
41typedef struct {
42 char *szName; //caps, including extension (e.g. "KERNEL32.DLL")
43 PIMAGE_FILE_HEADER pfh; //PE file header
44 PFN_INITDLL pfnInitterm;
45} CUSTOMBUILD_DLL;
46
47typedef struct {
48 char *szName;
49 PFN_INITDLL pfnInitterm;
50} CUSTOMBUILD_PRIVATE_INITTERM;
51
52typedef struct {
53 PFN_PRECUSTOMIZE pfnPreCustomize; //called after kernel32, user32 and gdi32 are initialized
54 PFN_POSTCUSTOMIZE pfnPostCustomize; //called at the end of dll load
55 PFN_ENDCUSTOMIZE pfnEndCustomize; //called when dll is unloaded
56
57 char *szCustomBuildDllName;
58
59 char *szRegistryBase;
60 char *szMemMapName;
61 char *szEnvExceptLogDisable;
62 char *szEnvExceptLogPath;
63 char *szPMWindowClassName;
64 char *szWindowHandleSemName;
65
66 //standard kernel32 settings
67 DWORD dwWindowsVersion;
68 BOOL fOdinIni;
69 BOOL fSMP;
70
71 //standard user32 settings
72 BOOL fDragDrop;
73 BOOL fOdinSysMenuItems;
74 DWORD dwWindowAppearance;
75 BOOL fMonoCursor;
76
77 //standard gdi32 settings
78 //font mappings (null terminated)
79 CUSTOMBUILD_FONTMAP fontMapping[MAX_FONT_MAPPINGS];
80 BOOL fFreeType;
81
82 //winmm
83 BOOL fDirectAudio;
84 BOOL fWaveAudio;
85
86 //first three important dlls (initialized in this order
87 CUSTOMBUILD_DLL dllNtdll;
88 CUSTOMBUILD_DLL dllKernel32;
89 CUSTOMBUILD_DLL dllUser32;
90 CUSTOMBUILD_DLL dllGdi32;
91
92 //list of remainder of registered dlls (order is important due to dependencies!!)
93 //(null terminated)
94 CUSTOMBUILD_DLL registeredDll[MAX_REGISTER_DLLS];
95
96 //list of dummy dlls (to prevent accidental load)
97 //(null terminated)
98 CUSTOMBUILD_DLL dummyDll[MAX_REGISTER_DLLS];
99
100} CUSTOMBUILD;
101
102typedef struct {
103 PFN_PRECUSTOMIZE pfnPreCustomize; //called after kernel32, user32 and gdi32 are initialized
104 PFN_POSTCUSTOMIZE pfnPostCustomize; //called at the end of dll load
105 PFN_ENDCUSTOMIZE pfnEndCustomize; //called when dll is unloaded
106 PFN_ISPESTUBLOADER pfnIsPeStubLoader;
107
108 char *szCustomBuildDllName;
109
110 char *szRegistryBase;
111 char *szEnvExceptLogDisable;
112 char *szEnvExceptLogPath;
113
114 //standard kernel32 settings
115 DWORD dwWindowsVersion;
116 BOOL fOdinIni;
117 BOOL fSMP;
118
119 //standard user32 settings
120 BOOL fDragDrop;
121 BOOL fOdinSysMenuItems;
122 DWORD dwWindowAppearance;
123 BOOL fMonoCursor;
124
125 //standard gdi32 settings
126 //font mappings (null terminated)
127 CUSTOMBUILD_FONTMAP fontMapping[MAX_FONT_MAPPINGS];
128 BOOL fFreeType;
129
130 //winmm
131 BOOL fDirectAudio;
132 BOOL fWaveAudio;
133
134 //list of remainder of registered dlls (order is important due to dependencies!!)
135 //(null terminated)
136 //(NTDLL, KERNEL32, USER32 and GDI32 are always registered)
137 CUSTOMBUILD_DLL registeredDll[MAX_REGISTER_DLLS];
138
139} CUSTOMBUILD_COMMON;
140
141BOOL WIN32API LoadCustomEnvironment(CUSTOMBUILD_COMMON *CustomBuild);
142BOOL WIN32API UnloadCustomEnvironment(BOOL fExitList);
143
144BOOL WIN32API InitExecutableEnvironment();
145BOOL WIN32API CheckCustomDllVersion(ULONG ulVersionMajor, ULONG ulVersionMinor);
146
147typedef BOOL (* WIN32API PFN_CHECKDLLVERSION)();
148BOOL WIN32API CheckDllVersion();
149
150extern BOOL fCustomBuild;
151
152void WIN32API SetRegistryRootKey(HKEY hRootkey, HKEY hKey);
153#ifdef __cplusplus
154void WIN32API SetCustomBuildName(char *lpszName, PIMAGE_FILE_HEADER pfh = NULL);
155#else
156void WIN32API SetCustomBuildName(char *lpszName, PIMAGE_FILE_HEADER pfh);
157#endif
158
159void WIN32API InitDirectoriesCustom(char *szSystemDir, char *szWindowsDir);
160
161void WIN32API DisableOdinIni();
162
163void WIN32API DisableOdinSysMenuItems();
164
165
166typedef HANDLE (* WIN32API PFNDRVOPEN)(LPVOID lpDriverData, DWORD dwAccess, DWORD dwShare, DWORD dwFlags, PVOID *ppHandleData);
167typedef void (* WIN32API PFNDRVCLOSE)(LPVOID lpDriverData, HANDLE hDevice, DWORD dwFlags, PVOID lpHandleData);
168typedef BOOL (* WIN32API PFNDRVIOCTL)(LPVOID lpDriverData, HANDLE hDevice, DWORD dwFlags, DWORD dwIoControlCode,
169 LPVOID lpInBuffer, DWORD nInBufferSize,
170 LPVOID lpOutBuffer, DWORD nOutBufferSize,
171 LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped,
172 LPVOID lpHandleData);
173
174typedef BOOL (* WIN32API PFNDRVREAD)(LPVOID lpDriverData,
175 HANDLE hDevice,
176 DWORD dwFlags,
177 LPCVOID lpBuffer,
178 DWORD nNumberOfBytesToRead,
179 LPDWORD lpNumberOfBytesRead,
180 LPOVERLAPPED lpOverlapped,
181 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
182 LPVOID lpHandleData);
183
184typedef BOOL (* WIN32API PFNDRVWRITE)(LPVOID lpDriverData,
185 HANDLE hDevice,
186 DWORD dwFlags,
187 LPCVOID lpBuffer,
188 DWORD nNumberOfBytesToWrite,
189 LPDWORD lpNumberOfBytesWrite,
190 LPOVERLAPPED lpOverlapped,
191 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
192 LPVOID lpHandleData);
193
194typedef BOOL (* WIN32API PFNDRVCANCELIO)(LPVOID lpDriverData, HANDLE hDevice, DWORD dwFlags, PVOID lpHandleData);
195typedef DWORD (* WIN32API PFNDRVGETOVERLAPPEDRESULT)(LPVOID lpDriverData,
196 HANDLE hDevice,
197 DWORD dwFlags,
198 LPOVERLAPPED lpOverlapped,
199 LPDWORD lpcbTransfer,
200 BOOL fWait,
201 LPVOID lpHandleData);
202
203BOOL WIN32API RegisterCustomDriver(PFNDRVOPEN pfnDriverOpen, PFNDRVCLOSE pfnDriverClose,
204 PFNDRVIOCTL pfnDriverIOCtl, PFNDRVREAD pfnDriverRead,
205 PFNDRVWRITE pfnDriverWrite, PFNDRVCANCELIO pfnDriverCancelIo,
206 PFNDRVGETOVERLAPPEDRESULT pfnDriverGetOverlappedResult,
207 LPCSTR lpDriverName, LPVOID lpDriverData);
208
209BOOL WIN32API UnRegisterCustomDriver(LPCSTR lpDriverName);
210
211
212//SetDialogHook can be used by a custom Odin build to register a hook procedure
213//that gets called before or after dialog creation
214
215#define HODIN_PREDIALOGCREATION 0
216#define HODIN_POSTDIALOGCREATION 1
217#define HODIN_WINDOWCREATED 2
218#define HODIN_PREWINDOWCREATEDA 3
219
220HHOOK WIN32API SetOdinHookA(HOOKPROC proc );
221BOOL WIN32API UnhookOdinHook(HHOOK hhook);
222LRESULT HOOK_CallOdinHookA(INT code, WPARAM wParam, LPARAM lParam );
223
224//Override LoadImage function
225typedef void (* WIN32API PFNLOADIMAGEW)(HINSTANCE *phinst, LPWSTR *lplpszName, UINT *lpuType);
226
227BOOL WIN32API SetCustomLoadImage(PFNLOADIMAGEW pfnLoadImageW);
228
229//Set the default language in kernel32
230void WIN32API SetDefaultLanguage(DWORD deflang);
231
232//Override pm keyboard hook dll name
233void WIN32API SetCustomPMHookDll(LPSTR pszKbdDllName);
234
235void WIN32API DisableDragDrop(BOOL fDisabled);
236
237//Turn off wave audio in winmm
238void WIN32API DisableWaveAudio();
239//Turn off usage of the Uniaud DirectAudio interface
240void WIN32API DisableDirectAudio();
241
242//Override shared semaphore name used to synchronize global window handle
243//array access (to avoid name clash with Odin)
244void WIN32API SetCustomWndHandleSemName(LPSTR pszSemName);
245
246//Override shared semaphore name used to synchronize global memory map
247//list access (to avoid name clash with Odin)
248void WIN32API SetCustomMMapSemName(LPSTR pszSemName);
249
250//Override std class names used in Odin
251void WIN32API SetCustomStdClassName(LPSTR pszStdClassName);
252char *WIN32API QueryCustomStdClassName();
253
254//Turn off ASPI
255void WIN32API DisableASPI();
256
257//force color to mono cursor conversion
258void WIN32API CustForceMonoCursor();
259
260//force GetVolumeInformation to tell the app all partitions are FAT
261void WIN32API CustForce2GBFileSize();
262
263//Logging of exceptions:
264//Override filename of exception log (expects full path)
265void WIN32API SetCustomExceptionLog(LPSTR lpszLogName);
266//Enable/disable exception logging
267void WIN32API SetExceptionLogging(BOOL fEnable);
268
269//Disable OS2CDROM.DMD aspi support
270void WIN32API DisableCDIo();
271
272//Force DirectDraw to report only one fullscreen mode
273void WIN32API SetCustomFullScreenMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP);
274
275//Force DirectSurface Lock & Unlock methods to hide & show the mouse cursor
276BOOL WIN32API SetCustomHideCursorOnLock(BOOL state);
277
278//Call to enable access to physical disks or volumes (default is disabled)
279void WIN32API EnablePhysicalDiskAccess(BOOL fEnable);
280
281//Override a system color without forcing a desktop repaint (which
282//SetSysColors does)
283BOOL WIN32API ODIN_SetSysColors(INT nChanges, const INT *lpSysColor,
284 const COLORREF *lpColorValues);
285
286//Override loader names (PEC, PE, W16ODIN)
287BOOL WIN32API ODIN_SetLoaders(LPCSTR pszPECmdLoader, LPCSTR pszPEGUILoader,
288 LPCSTR pszNELoader);
289
290//Returns path of loaders
291BOOL WIN32API ODIN_QueryLoaders(LPSTR pszPECmdLoader, INT cchPECmdLoader,
292 LPSTR pszPEGUILoader, INT cchPEGUILoader,
293 LPSTR pszNELoader, INT cchNELoader);
294
295//Checks whether program is LX or PE
296BOOL WIN32API ODIN_IsWin32App(LPSTR lpszProgramPath);
297
298//Custom build function to disable loading of LX dlls
299void WIN32API ODIN_DisableLXDllLoading();
300
301/**
302 * LoadLibrary*() callback function registered using ODIN_SetLxDllLoadCallback().
303 * This is called for all LX modules which are loaded by LoadLibrary.
304 *
305 * @returns TRUE loading should succeed. The DLL is now registered.
306 * @returns FALSE loading should fail.
307 * @param hmodOS2 The OS/2 module handle.
308 * @param hInstance The Odin instance handle.
309 * If not NULL this means that the DLL is registered.
310 */
311typedef BOOL (* WIN32API PFNLXDLLLOAD)(HMODULE hmodOS2, HINSTANCE hInstance);
312
313/** Custombuild API for registering a callback for LX Dll loading thru LoadLibrary*(). */
314BOOL WIN32API ODIN_SetLxDllLoadCallback(PFNLXDLLLOAD pfn);
315
316/**
317 * FreeLibrary*() callback function registered using ODIN_SetLxDllUnLoadCallback().
318 * This is called when an LX which was previously loaded using LoadLibrary*() is
319 * finally freed from Odin. The callback servers mainly the purpose of cleaning
320 * up any data associated with the DLL.
321 *
322 * It is called *AFTER* the module is freed from Odin but before it's actually
323 * unloaded from the OS/2 process. This means that the OS/2 handle is valid while
324 * the Odin handle is invalid.
325 *
326 * @param hmodOS2 The OS/2 module handle.
327 * @param hInstance The Odin instance handle (invalid!).
328 * @remark It likely that this callback will be called for more DLLs than the
329 * load callback. Do check handles properly.
330 */
331typedef void (* WIN32API PFNLXDLLUNLOAD)(HMODULE hmodOS2, HINSTANCE hInstance);
332
333BOOL WIN32API ODIN_SetLxDllUnLoadCallback(PFNLXDLLUNLOAD pfn);
334
335
336//******************************************************************************
337//Install a handler that is called before the entrypoint of a dll (DLL_PROCESS_ATTACH)
338//******************************************************************************
339typedef void (* WIN32API ODINPROC_DLLLOAD)(HMODULE hModule);
340
341BOOL WIN32API ODIN_SetDllLoadCallback(ODINPROC_DLLLOAD pfnMyDllLoad);
342
343
344//******************************************************************************
345// ODIN_SetProcAddress: Override a dll export
346//
347// Parameters:
348// HMODULE hModule Module handle
349// LPCSTR lpszProc Export name or ordinal
350// FARPROC pfnNewProc New export function address
351//
352// Returns: Success -> old address of export
353// Failure -> -1
354//
355//******************************************************************************
356FARPROC WIN32API ODIN_SetProcAddress(HMODULE hModule, LPCSTR lpszProc, FARPROC pfnNewProc);
357
358//******************************************************************************
359// ODIN_SetTIBSwitch: override TIB switching
360//
361// Parameters:
362// BOOL fSwitchTIB
363// FALSE -> no TIB selector switching
364// TRUE -> force TIB selector switching
365//
366//******************************************************************************
367void WIN32API ODIN_SetTIBSwitch(BOOL fSwitchTIB);
368
369//******************************************************************************
370// ODIN_DisableFolderShellLink
371//
372// Disable object creation in Odin folder. Desktop shortcuts will still be
373// created as WPS objects on the desktop.
374//
375//******************************************************************************
376void WIN32API ODIN_DisableFolderShellLink();
377
378//******************************************************************************
379// ODIN_waveOutSetFixedBuffers
380//
381// Tell WINMM to use DART buffers of the same size as the first buffer delivered
382// by waveOutWrite
383//
384// NOTE: This will only work in very specific cases; it is not a good general
385// purpose solution.
386//
387//******************************************************************************
388void WIN32API ODIN_waveOutSetFixedBuffers();
389
390#define SetFixedWaveBufferSize ODIN_waveOutSetFixedBuffers
391
392//******************************************************************************
393// ODIN_waveInSetFixedBuffers
394//
395// Tell WINMM to use DART buffers of the same size as the first buffer delivered
396// by waveInAddBuffer
397//
398// NOTE: This will only work in very specific cases; it is not a good general
399// purpose solution.
400//
401//******************************************************************************
402void WIN32API ODIN_waveInSetFixedBuffers();
403
404
405/** Enter odin context with this thread. */
406USHORT WIN32API ODIN_ThreadEnterOdinContext(void *pExceptionRegRec, BOOL fForceFSSwitch);
407/** Leave odin context with this thread. */
408void WIN32API ODIN_ThreadLeaveOdinContext(void *pExceptionRegRec, USHORT selFSOld);
409
410/** Leave odin context to call back into OS/2 code. */
411USHORT WIN32API ODIN_ThreadLeaveOdinContextNested(void *pExceptionRegRec, BOOL fRemoveOdinExcpt);
412/** Re-enter Odin context after being back in OS/2 code. */
413void WIN32API ODIN_ThreadEnterOdinContextNested(void *pExceptionRegRec, BOOL fRestoreOdinExcpt, USHORT selFSOld);
414
415void WIN32API ODIN_SetExceptionHandler(void *pExceptionRegRec);
416void WIN32API ODIN_UnsetExceptionHandler(void *pExceptionRegRec);
417
418/* Turn on CD Polling (window with 2 second timer to check CD disk presence) */
419void WIN32API CustEnableCDPolling();
420
421void WIN32API SetFreeTypeIntegration(BOOL fEnabled);
422
423// Special function to change dwords in the startup structure of a process
424void WINAPI ODIN_SetProcessDword( DWORD dwProcessID, INT offset, DWORD value );
425
426//PE headers of system dlls
427#ifdef __cplusplus
428extern "C" {
429#endif
430extern IMAGE_FILE_HEADER nt_ntdll_header;
431extern IMAGE_FILE_HEADER nt_gdi32_header;
432extern IMAGE_FILE_HEADER nt_kernel32_header;
433extern IMAGE_FILE_HEADER nt_user32_header;
434extern IMAGE_FILE_HEADER nt_advapi32_header;
435extern IMAGE_FILE_HEADER nt_version_header;
436extern IMAGE_FILE_HEADER nt_wsock32_header;
437extern IMAGE_FILE_HEADER nt_ws2_32_header;
438extern IMAGE_FILE_HEADER nt_winmm_header;
439extern IMAGE_FILE_HEADER nt_ole32_header;
440extern IMAGE_FILE_HEADER nt_comctl32_header;
441extern IMAGE_FILE_HEADER nt_shell32_header;
442extern IMAGE_FILE_HEADER nt_comdlg32_header;
443extern IMAGE_FILE_HEADER nt_winspool_header;
444extern IMAGE_FILE_HEADER nt_ddraw_header;
445extern IMAGE_FILE_HEADER nt_oleaut32_header;
446extern IMAGE_FILE_HEADER nt_msvfw32_header;
447extern IMAGE_FILE_HEADER nt_imm32_header;
448extern IMAGE_FILE_HEADER nt_mpr_header;
449extern IMAGE_FILE_HEADER nt_iphlpapi_header;
450extern IMAGE_FILE_HEADER nt_olepro32_header;
451extern IMAGE_FILE_HEADER nt_msvcrt_header;
452extern IMAGE_FILE_HEADER nt_lz32_header;
453extern IMAGE_FILE_HEADER nt_oledlg_header;
454extern IMAGE_FILE_HEADER nt_riched32_header;
455extern IMAGE_FILE_HEADER nt_psapi_header;
456extern IMAGE_FILE_HEADER nt_rpcrt4_header;
457extern IMAGE_FILE_HEADER nt_shlwapi_header;
458extern IMAGE_FILE_HEADER nt_shfolder_header;
459extern IMAGE_FILE_HEADER nt_wininet_header;
460extern IMAGE_FILE_HEADER nt_olepro32_header;
461extern IMAGE_FILE_HEADER nt_avifil32_header;
462extern IMAGE_FILE_HEADER nt_dinput_header;
463extern IMAGE_FILE_HEADER nt_dsound_header;
464extern IMAGE_FILE_HEADER nt_uxtheme_header;
465extern IMAGE_FILE_HEADER nt_mciwave_header;
466extern IMAGE_FILE_HEADER nt_urlmon_header;
467#ifdef __cplusplus
468}
469#endif
470
471#endif /*__CUSTOMBUILD_H__*/
472
Note: See TracBrowser for help on using the repository browser.