mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-16 02:37:38 +00:00
988ca977ab
Mon Jun 20 14:26:41 1994 Bob Amstadt (bob@pooh) * [objects/bitmap.c] Allow negative bitmap sizes. Sun Jun 19 12:00:04 1994 David Metcalfe <david@prism.demon.co.uk> * [controls/edit.c] Improved selection display. Added processing for WM_SETFONT, EM_REPLACESEL, EM_LINELENGTH, EM_UNDO, EM_EMPTYUNDOBUFFER, EM_GETHANDLE, EM_SETHANDLE messages. Text buffer now stored on application's local heap. * [windows/graphics.c] Corrected bug in Rectangle(). XFillRectangle has the same width as Rectangle, but XDrawRectangle is one pixel wider for the same co-ordinates. * [memory/heap.c] [include/heap.h] Added HEAP_LocalSize function. * [windows/event.c] [windows/keyboard.c] Improvements to KeyStateTable and addition of AsyncKeyStateTable. Added supporting code to GetKeyState and GetAsyncKeyState and merged mouse button states into GetKeyboardState. * [loader/resource.c] [include/accel.h] Added recognition of SHIFT, CONTROL and ALT keys to TranslateAccelerator. * [objects/metafile.c] [objects/font.c] [objects/bitblt.c] A bit more metafile support. Sun Jun 19 17:29:00 MET DST 1994 Erik Bos (erik@hacktic.nl) * [loader/resource.c] SizeofResource() and AllocResource() added, AccessResource() updated. * [if1632/kernel.spec] FreeLibrary() used for FreeModule(). * [windows/graphics.c] Rectangle(): swap left & right corners when right < left, swap top & bottom when botton < top. Jun 19, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) * [controls/combo.c] Fix bug in window style of the associated listbox. * [controls/menu.c] Skip separators in keyboard navigation by using new internal functions SelectPrevItem() & SelectNextItem(), * [misc/profile.c] Bug fix in GetPrivateProfileInt(), was limited to 4 digit, IntBuf must be alloc to (5+1)=6. char instead of 5. * [misc/main.c] Put code in functions SetEnvironment() & GetEnvironment(). * [misc/shell.c] Start putting some code in ExtractIcon() function. * [misc/mmsystem.c] Some code for MMTimer functions & timers list. * [miscemu/int31.c] Few stubs for DPMI interrupt calls. Nothing work yet. Mon Jun 20 07:37:43 EDT 1994 John Richardson (jrichard@cs.uml.edu) * include/win.h (tagWND): Added icon fields icon, hIcon and rectClientSave to the tagWND struct. * windows/Imakefile Added icon.c to the list of files to compile * windows/dce.c (GetDCEx): Added some checks for iconic mode and pass icon window as drawable, not the real window. * windows/defwnd.c (DefWindowProc) Added PAINTICON default windows procedure. * windows/event.c (EVENT_Expose) Added check for iconic window expose. If iconic window is exposed send a WM_PAINTICON message * windows/icon.c New file. ICON_Iconify, ICON_findIconFromPoint, ICON_Deiconify. * windows/mdi.c (DefMDIChildProc) Test for IsIconic during a SC_RESTORE, this doesn't work yet. * windows/message.c (hardware_event) Looks for icon as well as window now. * windows/nonclient.c (NC_HandleSysCommand, NC_DoNCPaintIcon) Added iconify/deiconify in NC_HandleSysCommand, new function NC_DoNCPaintIcon which paints an icon. * windows/painting.c (BeginPaint) Made a BeginPaint select the STOCK_BLACK_PEN, STOCK_WHITE_BRUSH, and STOCK_SYSTEM_FONT objects since this is (hopefully) default windows behavior. * windows/win.h (CreateWindowEx) Set the default background color of a window to be white. Create icon window, turn off MINIMIZE if it is on, since I don't know what to do with it as of yet... register the icon with the hwnd of its window so we can identify where icon messages are coming from. Mon Jun 20 10:15:59 1994 Miguel de Icaza (miguel@sphinx) * windows/event.c: Added a hack to define XPointer when using X11R4. * toolkit/hello.c: Test application for WineLib. To compile you'll need: gcc -Iinclude -DWINELIB -g hello.c -c, and to link you'll need: gcc hello.o libwine.a -lX11 -L/usr/openwin/lib -lm * toolkit/heap.c: Extended the size of the block size per chunk. * misc/stress.c (GetFreeFileHandles): Fixed typo. * misc/main.c (main): Changes to allow compilation under SunOS. * loader/library.c: Changed some ifdefs to compile WineLib.
412 lines
10 KiB
C
412 lines
10 KiB
C
/*
|
|
* Modules & Libraries functions
|
|
*/
|
|
static char Copyright[] = "Copyright Martin Ayotte, 1994";
|
|
|
|
/*
|
|
#define DEBUG_MODULE
|
|
*/
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include "wine.h"
|
|
#include "prototypes.h"
|
|
#include "windows.h"
|
|
#include "dlls.h"
|
|
#include "task.h"
|
|
#include "toolhelp.h"
|
|
|
|
extern struct w_files *wine_files;
|
|
extern struct dll_name_table_entry_s dll_builtin_table[];
|
|
|
|
struct w_files *GetFileInfo(HANDLE);
|
|
char *GetDosFileName(char *);
|
|
|
|
#define IS_BUILTIN_DLL(handle) ((handle >> 8) == 0xff)
|
|
|
|
/**********************************************************************/
|
|
|
|
void ExtractDLLName(char *libname, char *temp)
|
|
{
|
|
int i;
|
|
|
|
strcpy(temp, libname);
|
|
if (strchr(temp, '\\') || strchr(temp, '/'))
|
|
for (i = strlen(temp) - 1; i ; i--)
|
|
if (temp[i] == '\\' || temp[i] == '/') {
|
|
strcpy(temp, temp + i + 1);
|
|
break;
|
|
}
|
|
for (i = strlen(temp) - 1; i ; i--)
|
|
if (temp[i] == '.') {
|
|
temp[i] = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/**********************************************************************
|
|
* GetModuleHandle [KERNEL.47]
|
|
*/
|
|
HANDLE GetModuleHandle(LPSTR lpModuleName)
|
|
{
|
|
register struct w_files *w = wine_files;
|
|
int i;
|
|
char dllname[256];
|
|
|
|
if ((int) lpModuleName & 0xffff0000)
|
|
ExtractDLLName(lpModuleName, dllname);
|
|
|
|
if ((int) lpModuleName & 0xffff0000)
|
|
printf("GetModuleHandle('%s');\n", lpModuleName);
|
|
else
|
|
printf("GetModuleHandle('%x');\n", lpModuleName);
|
|
|
|
/* printf("GetModuleHandle // searching in builtin libraries\n");*/
|
|
for (i = 0; i < N_BUILTINS; i++) {
|
|
if (dll_builtin_table[i].dll_name == NULL) break;
|
|
if (((int) lpModuleName & 0xffff0000) == 0) {
|
|
if (0xFF00 + i == (int) lpModuleName) {
|
|
printf("GetModuleHandle('%s') return %04X \n",
|
|
lpModuleName, 0xff00 + i);
|
|
return 0xFF00 + i;
|
|
}
|
|
}
|
|
else if (strcasecmp(dll_builtin_table[i].dll_name, dllname) == 0) {
|
|
printf("GetModuleHandle('%x') return %04X \n",
|
|
lpModuleName, 0xFF00 + i);
|
|
return (0xFF00 + i);
|
|
}
|
|
}
|
|
|
|
printf("GetModuleHandle // searching in loaded modules\n");
|
|
while (w) {
|
|
/* printf("GetModuleHandle // '%x' \n", w->name); */
|
|
if (((int) lpModuleName & 0xffff0000) == 0) {
|
|
if (w->hinstance == (int) lpModuleName) {
|
|
printf("GetModuleHandle('%x') return %04X \n",
|
|
lpModuleName, w->hinstance);
|
|
return w->hinstance;
|
|
}
|
|
}
|
|
else if (strcasecmp(w->name, dllname) == 0) {
|
|
printf("GetModuleHandle('%s') return %04X \n",
|
|
lpModuleName, w->hinstance);
|
|
return w->hinstance;
|
|
}
|
|
w = w->next;
|
|
}
|
|
printf("GetModuleHandle('%x') not found !\n", lpModuleName);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/**********************************************************************
|
|
* GetModuleUsage [KERNEL.48]
|
|
*/
|
|
int GetModuleUsage(HANDLE hModule)
|
|
{
|
|
struct w_files *w;
|
|
|
|
printf("GetModuleUsage(%04X);\n", hModule);
|
|
|
|
/* built-in dll ? */
|
|
if (IS_BUILTIN_DLL(hModule))
|
|
return 2;
|
|
|
|
w = GetFileInfo(hModule);
|
|
/* return w->Usage; */
|
|
return 1;
|
|
}
|
|
|
|
|
|
/**********************************************************************
|
|
* GetModuleFilename [KERNEL.49]
|
|
*/
|
|
int GetModuleFileName(HANDLE hModule, LPSTR lpFileName, short nSize)
|
|
{
|
|
struct w_files *w;
|
|
LPSTR str;
|
|
char windir[256], temp[256];
|
|
|
|
printf("GetModuleFileName(%04X, %08X, %d);\n", hModule, lpFileName, nSize);
|
|
|
|
if (lpFileName == NULL) return 0;
|
|
if (nSize < 1) return 0;
|
|
|
|
/* built-in dll ? */
|
|
if (IS_BUILTIN_DLL(hModule)) {
|
|
GetWindowsDirectory(windir, sizeof(windir));
|
|
sprintf(temp, "%s\\%s.DLL", windir, dll_builtin_table[hModule & 0x00ff].dll_name);
|
|
ToDos(temp);
|
|
strncpy(lpFileName, temp, nSize);
|
|
printf("GetModuleFileName copied '%s' (internal dll) return %d \n", lpFileName, nSize);
|
|
return strlen(lpFileName);
|
|
}
|
|
|
|
/* check loaded dlls */
|
|
if ((w = GetFileInfo(hModule)) == NULL)
|
|
return 0;
|
|
str = GetDosFileName(w->filename);
|
|
if (nSize > strlen(str)) nSize = strlen(str) + 1;
|
|
strncpy(lpFileName, str, nSize);
|
|
printf("GetModuleFileName copied '%s' return %d \n", lpFileName, nSize);
|
|
return nSize - 1;
|
|
}
|
|
|
|
|
|
/**********************************************************************
|
|
* LoadLibrary [KERNEL.95]
|
|
*/
|
|
HANDLE LoadLibrary(LPSTR libname)
|
|
{
|
|
HANDLE h;
|
|
|
|
if ((h = LoadImage(libname, DLL, 0)) < 32)
|
|
return h;
|
|
|
|
if (!IS_BUILTIN_DLL(h))
|
|
InitDLL(GetFileInfo(h));
|
|
|
|
return h;
|
|
}
|
|
|
|
|
|
/**********************************************************************
|
|
* FreeLibrary [KERNEL.96]
|
|
*/
|
|
void FreeLibrary(HANDLE hLib)
|
|
{
|
|
printf("FreeLibrary(%04X);\n", hLib);
|
|
|
|
/* built-in dll ? */
|
|
if (IS_BUILTIN_DLL(hLib))
|
|
return;
|
|
|
|
/*
|
|
while (lpMod != NULL) {
|
|
if (lpMod->hInst == hLib) {
|
|
if (lpMod->Count == 1) {
|
|
if (hLib != (HANDLE)NULL) GlobalFree(hLib);
|
|
if (lpMod->ModuleName != NULL) free(lpMod->ModuleName);
|
|
if (lpMod->FileName != NULL) free(lpMod->FileName);
|
|
GlobalFree(lpMod->hModule);
|
|
printf("FreeLibrary // freed !\n");
|
|
return;
|
|
}
|
|
lpMod->Count--;
|
|
printf("FreeLibrary // Count decremented !\n");
|
|
return;
|
|
}
|
|
lpMod = lpMod->lpNextModule;
|
|
}
|
|
*/
|
|
}
|
|
|
|
|
|
/**********************************************************************
|
|
* GetProcAddress [KERNEL.50]
|
|
*/
|
|
FARPROC GetProcAddress(HANDLE hModule, char *proc_name)
|
|
{
|
|
int i, sel, addr, ret;
|
|
register struct w_files *w = wine_files;
|
|
int ordinal, len;
|
|
char * cpnt;
|
|
char C[128];
|
|
HTASK hTask;
|
|
LPTASKENTRY lpTask;
|
|
|
|
/* built-in dll ? */
|
|
if (IS_BUILTIN_DLL(hModule))
|
|
{
|
|
if ((int) proc_name & 0xffff0000)
|
|
{
|
|
printf("GetProcAddress: builtin %#04X, '%s'\n",
|
|
hModule, proc_name);
|
|
if (GetEntryDLLName(dll_builtin_table[hModule - 0xFF00].dll_name,
|
|
proc_name, &sel, &addr))
|
|
{
|
|
printf("Address not found !\n");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
printf("GetProcAddress: builtin %#04X, %d\n",
|
|
hModule, (int)proc_name);
|
|
if (GetEntryDLLOrdinal(dll_builtin_table[hModule-0xFF00].dll_name,
|
|
(int)proc_name & 0x0000FFFF, &sel, &addr))
|
|
{
|
|
printf("Address not found !\n");
|
|
}
|
|
}
|
|
ret = MAKELONG(addr, sel);
|
|
printf("GetProcAddress // ret=%08X sel=%04X addr=%04X\n",
|
|
ret, sel, addr);
|
|
return (FARPROC)ret;
|
|
}
|
|
if (hModule == 0)
|
|
{
|
|
hTask = GetCurrentTask();
|
|
printf("GetProcAddress // GetCurrentTask()=%04X\n", hTask);
|
|
lpTask = (LPTASKENTRY) GlobalLock(hTask);
|
|
if (lpTask == NULL)
|
|
{
|
|
printf("GetProcAddress: can't find current module handle !\n");
|
|
return NULL;
|
|
}
|
|
hModule = lpTask->hInst;
|
|
printf("GetProcAddress: current module=%04X instance=%04X!\n",
|
|
lpTask->hModule, lpTask->hInst);
|
|
GlobalUnlock(hTask);
|
|
}
|
|
while (w && w->hinstance != hModule)
|
|
w = w->next;
|
|
if (w == NULL)
|
|
return NULL;
|
|
printf("GetProcAddress // Module Found ! w->filename='%s'\n", w->filename);
|
|
if ((int)proc_name & 0xFFFF0000)
|
|
{
|
|
AnsiUpper(proc_name);
|
|
printf("GetProcAddress: %04X, '%s'\n", hModule, proc_name);
|
|
cpnt = w->nrname_table;
|
|
while(TRUE)
|
|
{
|
|
if (((int) cpnt) - ((int)w->nrname_table) >
|
|
w->ne_header->nrname_tab_length) return NULL;
|
|
len = *cpnt++;
|
|
strncpy(C, cpnt, len);
|
|
C[len] = '\0';
|
|
#ifdef DEBUG_MODULE
|
|
printf("pointing Function '%s' ordinal=%d !\n",
|
|
C, *((unsigned short *)(cpnt + len)));
|
|
#endif
|
|
if (strncmp(cpnt, proc_name, len) == 0)
|
|
{
|
|
ordinal = *((unsigned short *)(cpnt + len));
|
|
break;
|
|
}
|
|
cpnt += len + 2;
|
|
}
|
|
if (ordinal == 0)
|
|
{
|
|
printf("GetProcAddress // function '%s' not found !\n", proc_name);
|
|
return NULL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
printf("GetProcAddress: %#04x, %d\n", hModule, (int) proc_name);
|
|
ordinal = (int)proc_name;
|
|
}
|
|
ret = GetEntryPointFromOrdinal(w, ordinal);
|
|
if (ret == -1)
|
|
{
|
|
printf("GetProcAddress // Function #%d not found !\n", ordinal);
|
|
return NULL;
|
|
}
|
|
addr = ret & 0xffff;
|
|
sel = (ret >> 16);
|
|
printf("GetProcAddress // ret=%08X sel=%04X addr=%04X\n", ret, sel, addr);
|
|
return (FARPROC) ret;
|
|
}
|
|
|
|
/* internal dlls */
|
|
static void
|
|
FillModStructBuiltIn(MODULEENTRY *lpModule, struct dll_name_table_entry_s *dll)
|
|
{
|
|
lpModule->dwSize = dll->dll_table_length * 1024;
|
|
strcpy(lpModule->szModule, dll->dll_name);
|
|
lpModule->hModule = 0xff00 + dll->dll_number;
|
|
lpModule->wcUsage = GetModuleUsage(lpModule->hModule);
|
|
GetModuleFileName(lpModule->hModule, lpModule->szExePath, MAX_PATH + 1);
|
|
lpModule->wNext = 0;
|
|
}
|
|
|
|
/* loaded dlls */
|
|
static void
|
|
FillModStructLoaded(MODULEENTRY *lpModule, struct w_files *dll)
|
|
{
|
|
lpModule->dwSize = 16384;
|
|
strcpy(lpModule->szModule, dll->name);
|
|
lpModule->hModule = dll->hinstance;
|
|
lpModule->wcUsage = GetModuleUsage(lpModule->hModule);
|
|
GetModuleFileName(lpModule->hModule, lpModule->szExePath, MAX_PATH + 1);
|
|
lpModule->wNext = 0;
|
|
}
|
|
|
|
/**********************************************************************
|
|
* ModuleFirst [TOOHELP.59]
|
|
*/
|
|
BOOL ModuleFirst(MODULEENTRY *lpModule)
|
|
{
|
|
printf("ModuleFirst(%08X)\n", lpModule);
|
|
|
|
FillModStructBuiltIn(lpModule, &dll_builtin_table[0]);
|
|
return TRUE;
|
|
}
|
|
|
|
/**********************************************************************
|
|
* ModuleNext [TOOHELP.60]
|
|
*/
|
|
BOOL ModuleNext(MODULEENTRY *lpModule)
|
|
{
|
|
struct w_files *w;
|
|
|
|
printf("ModuleNext(%08X)\n", lpModule);
|
|
|
|
if (IS_BUILTIN_DLL(lpModule->hModule)) {
|
|
/* last built-in ? */
|
|
if ((lpModule->hModule & 0xff) == (N_BUILTINS - 1) ) {
|
|
if (wine_files) {
|
|
FillModStructLoaded(lpModule, wine_files);
|
|
return TRUE;
|
|
} else
|
|
return FALSE;
|
|
}
|
|
FillModStructBuiltIn(lpModule, &dll_builtin_table[(lpModule->hModule & 0xff)+1]);
|
|
return TRUE;
|
|
}
|
|
w = GetFileInfo(lpModule->hModule);
|
|
if (w->next) {
|
|
FillModStructLoaded(lpModule, w->next);
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/**********************************************************************
|
|
* ModuleFindHandle [TOOHELP.62]
|
|
*/
|
|
HMODULE ModuleFindHandle(MODULEENTRY *lpModule, HMODULE hModule)
|
|
{
|
|
struct w_files *w;
|
|
|
|
printf("ModuleFindHandle(%08X, %04X)\n", lpModule, hModule);
|
|
|
|
/* built-in dll ? */
|
|
if (IS_BUILTIN_DLL(hModule)) {
|
|
FillModStructBuiltIn(lpModule, &dll_builtin_table[hModule & 0xff]);
|
|
return hModule;
|
|
}
|
|
|
|
/* check loaded dlls */
|
|
if ((w = GetFileInfo(hModule)) == NULL)
|
|
return (HMODULE) NULL;
|
|
|
|
FillModStructLoaded(lpModule, w);
|
|
return w->hinstance;
|
|
}
|
|
|
|
/**********************************************************************
|
|
* ModuleFindName [TOOHELP.61]
|
|
*/
|
|
HMODULE ModuleFindName(MODULEENTRY *lpModule, LPCSTR lpstrName)
|
|
{
|
|
return (ModuleFindHandle(lpModule, GetModuleHandle((char*)lpstrName)));
|
|
}
|
|
|