mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-14 17:06:19 +00:00
491502b951
Thu Oct 30 21:52:23 1997 Martin Boehme <boehme@informatik.mu-luebeck.de> * [windows/nonclient.c] Changed NC_TrackSysMenu to give the same behaviour as MS-Windows, i.e. system menu already appears when mouse button is depressed. Changed NC_HandleNCLButtonDblClk so that double clicks on scroll bar arrows are handled the same way as single clicks. * [windows/winpos.c] Fixed SetWindowPos32 to clear WIN_NO_REDRAW when SWP_SHOWWINDOW is set; this is the way MS-Windows behaves. Thu Oct 30 21:08:57 1997 Morten Welinder <terra@diku.dk> * [controls/status.c] In SW_SetText, fix condition, I hope. * [controls/menu.c] (GetMenuState32): Don't mask return value. Print more debug info. (MENU_MenuBarCalcSize): Be more careful when printing debug information. (MENU_SetItemData): Empty strings are separators. * [graphics/x11drv/text.c] Don't prototype CLIPPING_IntersectClipRect. * [include/dc.h] Prototype CLIPPING_IntersectClipRect. * [objects/font.c] Remove non-portable (and faulty) smartness in FONT_TextMetric*to*. In CreateFont32W and CreateFont16, handle null font name. * [objects/text.c] (TEXT_NextLine): Fix end-of-line bug. * [if1632/shell32.spec] Activate existing implementation of ExtractIconA. * [misc/shell.c] For Control_RunDLL, add types for parameters. Thu Oct 30 14:54:11 1997 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de> * [controls/static.c] [include/windows.h] [misc/spy.c] Added some win32 defines to static controls, basic SS_BITMAP style handling implemented. [please add more, I am lacking knowledge and time] * [controls/status.c] part_num 255 seems to indicate whole statusline (win95 cdplayer.exe) * [if1632/thunk.c] [tools/build.c] Support lret and 0x66 lret calls for CallTo16_regs (needed for KERNEL32_45) Fixed KERNEL32_45, QT_Thunk (should work now). * [if1632/relay.c][if1632/builtin.c][tools/build.c][if1632/*32.spec] Added string dumping to relay debugging for win32 apifuncs. * [misc/ver.c] Fixed and cleaned up VerQueryValue*. * [multimedia/*.c][include/mmsystem.h][if1632/mmsystem.spec] [if1632/winmm.spec] Win32 support for lowlevel multimedia functions. Added some mixer* lowlevel functions. Some small fixes in the audio lowlevel queue handling, code reformatting/cleanups. * [debugger/hash.c] Don't show difference between 16bit symbols if they are in different segments. * [objects/cursoricon.c] Added GetIconInfo (partial) and CreateIconIndirect. * [windows/mdi.c] Fixed some "bad class" problems and crashes in MDICreateChild, which happen in Win32 (jwp32.exe). Wed Oct 29 00:57:27 1997 Bruce Milner <Bruce.Milner@genetics.utah.edu> * [if1632/winaspi.spec] [misc/aspi.c] [include/aspi.c] [documentation/aspi] [include/callback.h] Added support for 16 bit ASPI calls to linux generic SCSI. The support is not complete, but appears to run my Mustek scanner from within ipplus.exe. Mon Oct 27 00:59:41 1997 Alex Korobka <alex@trantor.pharm.sunysb.edu> * [windows/dce.c] DC reuse framework. Sun Oct 26 18:41:21 1997 Huw D M Davies <h.davies1@physics.oxford.ac.uk> * [graphics/x11drv/xfont.c] Substituted fonts are removed from the alias table. References to the old name are also updated. * [controls/combo.c] LB_SELECTSTRING32 not CB_SELECTSTRING32 should be sent to ComboLBox. Sun Oct 26 14:25:00 1997 Nikita V. Youshchenko <yoush@cs.msu.su> * [include/drive.h] [files/drive.c] [msdos/int21.c] Partially implemented DOS drive mapping (int21 AX=440F). Sat Oct 25 13:03:29 1997 Alexandre Julliard <julliard@lrc.epfl.ch> * [debugger/debug.l] Support '.' in identifiers. Use "x . y" to access structure fields. * [debugger/hash.c] [loader/pe_image.c] Load entry points of Win32 modules only when entering the debugger. * [debugger/break.c] New function DEBUG_AddModuleBreakpoint() to set a breakpoint at the start of every module. * [files/file.c] FILE_mmap() can now fake mmap() for unaligned offsets or broken filesystems. * [include/callback.h] [misc/callback.c] [if1632/thunk.c] Use a table of callbacks instead of macros to differentiate between emulator and Winelib. * [loader/task.c] Initialize current directory from cwd, not from module path. * [tools/build.c] Read CallTo16 prototypes directly from thunk.c source file. * [windows/winproc.c] [windows/mdi.c] Added translation for WM_MDIACTIVATE and WM_MDIGETACTIVE. Fri Oct 24 21:41:25 1997 Uwe Bonnes <bon@elektron.ikp.tu-darmstadt.de> * [files/drive.c] Allow arguments like "a" for the drive related apis. * [memory/global.c] Keep the calculation for dwMemoryLoad in range. * [misc/crtdll.c] Make CRTDLL_getcwd use GetCurrentDirectory32A and alloc its memory if requested. Implemented CRTDLL_rename and CRTDLL_stat needed for lcc-win32:wedit.exe. Implemented CRTDLL__fullpath. * [misc/comm.c] High speed modes for the 16-bit mode Comm functions. * [misc/cpu.c] As applications may treat lpMaximumApplicationAddress as long, use a valid long number. * [misc/main.c] In SystemParametersInfo16 ignore SPI_GETHIGHCONTRAST too. * [misc/ole2nls.c] Implement LCMAP_UPPERCASE for LCMapString32. * [misc/wsprintf] Made WPRINTF_ParseFormatA understand %ws. * [win32/file.c] Ignore FILE_ATTRIBUTE_NORMAL. Stub for ReadFileEx. Fri Oct 24 15:36:02 1997 Doug Ridgway <ridgway@routh.ucsd.edu> * [memory/local.c] Local heap exhaustion message now prints which builtin heap filled. Fri Oct 24 00:46:34 1997 Huw D M Davies <h.davies1@physics.oxford.ac.uk> * [windows/dialog.c] Reversed CreateFont16/32W typo. Thu Oct 23 23:44:20 1997 Kristian Nielsen <kristian.nielsen@risoe.dk> * [if1632/user.spec] Fixed argument list for ChangeClipboardChain. * [windows/mdi.c] Pass correct hInstance to CreateWindow16() in MDICreateChild(). Mon Oct 20 11:51:24 1997 Carsten Fallesen <cf@it.dtu.dk> * [objects/metafile.c] Added support for META_SETTEXTCHAREXTRA. * [objects/region.c] Fixed crash in XPolygonRegion if there is only one point in in the region. * [if1632/gdi32.spec][include/gdi.h][include/windows.h] [objects/gdiobj.c] Completed OBJ_XXX defines in gdi.h, removed OBJ_XXX in gdiobj.c and included gdi.h instead. Implemented GetObjectType32(). Thu Oct 16 17:21:32 1997 Philippe De Muyter <phdm@info.ucl.ac.be> * [documentation/wine.texinfo] Fixed WIN32 and Makefiles entries of Reference manual node, that made makeinfo dump core. Mon Oct 13 17:15:57 1997 Robert Wilhelm <robert@physiol.med.tu-muenchen.de> * [if1632/crtdll.spec] Added missing math functions y0(), y1(), y2(), floor(), frexp(), ldexp(), modf().
310 lines
8.1 KiB
C
310 lines
8.1 KiB
C
/*
|
|
* Wine Drivers functions
|
|
*
|
|
* Copyright 1994 Martin Ayotte
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include "windows.h"
|
|
#include "win.h"
|
|
#include "callback.h"
|
|
#include "driver.h"
|
|
#include "module.h"
|
|
#include "stddebug.h"
|
|
#include "debug.h"
|
|
|
|
LPDRIVERITEM lpDrvItemList = NULL;
|
|
|
|
void LoadStartupDrivers(void)
|
|
{
|
|
HDRVR16 hDrv;
|
|
char str[256];
|
|
LPSTR ptr;
|
|
|
|
if (GetPrivateProfileString32A( "drivers", NULL, "", str, sizeof(str),
|
|
"SYSTEM.INI" ) < 2)
|
|
{
|
|
fprintf( stderr,
|
|
"LoadStartupDrivers // can't find drivers section in system.ini\n" );
|
|
return;
|
|
}
|
|
|
|
ptr = str;
|
|
while (lstrlen32A( ptr ) != 0)
|
|
{
|
|
dprintf_driver( stddeb, "LoadStartupDrivers // str='%s'\n", ptr );
|
|
hDrv = OpenDriver( ptr, "drivers", 0L );
|
|
dprintf_driver( stddeb, "LoadStartupDrivers // hDrv=%04x\n", hDrv );
|
|
ptr += lstrlen32A(ptr) + 1;
|
|
}
|
|
dprintf_driver( stddeb, "LoadStartupDrivers // end of list !\n" );
|
|
|
|
return;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* SendDriverMessage [USER.251]
|
|
*/
|
|
LRESULT WINAPI SendDriverMessage(HDRVR16 hDriver, UINT16 msg, LPARAM lParam1,
|
|
LPARAM lParam2)
|
|
{
|
|
LPDRIVERITEM lpdrv;
|
|
LRESULT retval;
|
|
|
|
dprintf_driver( stddeb, "SendDriverMessage(%04x, %04X, %08lX, %08lX)\n",
|
|
hDriver, msg, lParam1, lParam2 );
|
|
|
|
lpdrv = (LPDRIVERITEM)GlobalLock16( hDriver );
|
|
if (lpdrv == NULL || lpdrv->dis.hDriver != hDriver)
|
|
{
|
|
GlobalUnlock16( hDriver );
|
|
return 0;
|
|
}
|
|
|
|
retval = Callbacks->CallDriverProc( lpdrv->lpDrvProc, 0L /* FIXME */,
|
|
hDriver, msg, lParam1, lParam2 );
|
|
|
|
dprintf_driver( stddeb, "SendDriverMessage // retval = %ld\n", retval );
|
|
|
|
GlobalUnlock16( hDriver );
|
|
return retval;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* OpenDriver [USER.252]
|
|
*/
|
|
HDRVR16 WINAPI OpenDriver(LPSTR lpDriverName, LPSTR lpSectionName, LPARAM lParam)
|
|
{
|
|
HDRVR16 hDrvr;
|
|
LPDRIVERITEM lpdrv, lpnewdrv;
|
|
char DrvName[128];
|
|
WORD ordinal;
|
|
|
|
dprintf_driver( stddeb,"OpenDriver('%s', '%s', %08lX);\n",
|
|
lpDriverName, lpSectionName, lParam );
|
|
|
|
if (lpSectionName == NULL) lpSectionName = "drivers";
|
|
GetPrivateProfileString32A( lpSectionName, lpDriverName, "", DrvName,
|
|
sizeof(DrvName), "SYSTEM.INI" );
|
|
dprintf_driver( stddeb,"OpenDriver // DrvName='%s'\n", DrvName );
|
|
if (lstrlen32A(DrvName) < 1) return 0;
|
|
|
|
lpdrv = lpDrvItemList;
|
|
while (lpdrv) /* XXX find it... like this? */
|
|
{
|
|
if (!lstrcmpi32A( lpDriverName, lpdrv->dis.szAliasName ))
|
|
{
|
|
lpdrv->count++;
|
|
SendDriverMessage( lpdrv->dis.hDriver, DRV_OPEN, 0L, lParam );
|
|
return lpdrv->dis.hDriver;
|
|
}
|
|
lpdrv = lpdrv->lpNextItem;
|
|
}
|
|
|
|
lpdrv = lpDrvItemList; /* find end of list */
|
|
if (lpdrv != NULL)
|
|
while (lpdrv->lpNextItem != NULL)
|
|
lpdrv = lpdrv->lpNextItem;
|
|
|
|
hDrvr = GlobalAlloc16( GMEM_MOVEABLE, sizeof(DRIVERITEM) );
|
|
lpnewdrv = (LPDRIVERITEM)GlobalLock16( hDrvr );
|
|
if (lpnewdrv == NULL) return 0;
|
|
lpnewdrv->dis.length = sizeof( DRIVERINFOSTRUCT16 );
|
|
lpnewdrv->dis.hModule = LoadModule16( DrvName, (LPVOID)-1 );
|
|
if (!lpnewdrv->dis.hModule)
|
|
{
|
|
GlobalUnlock16( hDrvr );
|
|
GlobalFree16( hDrvr );
|
|
return 0;
|
|
}
|
|
lpnewdrv->dis.hDriver = hDrvr;
|
|
lstrcpy32A( lpnewdrv->dis.szAliasName, lpDriverName );
|
|
lpnewdrv->count = 1;
|
|
ordinal = MODULE_GetOrdinal( lpnewdrv->dis.hModule, "DRIVERPROC" );
|
|
if (!ordinal ||
|
|
!(lpnewdrv->lpDrvProc = (DRIVERPROC16)MODULE_GetEntryPoint(
|
|
lpnewdrv->dis.hModule, ordinal )))
|
|
{
|
|
FreeModule16( lpnewdrv->dis.hModule );
|
|
GlobalUnlock16( hDrvr );
|
|
GlobalFree16( hDrvr );
|
|
return 0;
|
|
}
|
|
|
|
lpnewdrv->lpNextItem = NULL;
|
|
if (lpDrvItemList == NULL)
|
|
{
|
|
lpDrvItemList = lpnewdrv;
|
|
lpnewdrv->lpPrevItem = NULL;
|
|
}
|
|
else
|
|
{
|
|
lpdrv->lpNextItem = lpnewdrv;
|
|
lpnewdrv->lpPrevItem = lpdrv;
|
|
}
|
|
|
|
SendDriverMessage( hDrvr, DRV_LOAD, 0L, lParam );
|
|
SendDriverMessage( hDrvr, DRV_ENABLE, 0L, lParam );
|
|
SendDriverMessage( hDrvr, DRV_OPEN, 0L, lParam );
|
|
|
|
dprintf_driver( stddeb, "OpenDriver // hDrvr=%04x loaded !\n", hDrvr );
|
|
return hDrvr;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* CloseDriver [USER.253]
|
|
*/
|
|
LRESULT WINAPI CloseDriver(HDRVR16 hDrvr, LPARAM lParam1, LPARAM lParam2)
|
|
{
|
|
LPDRIVERITEM lpdrv;
|
|
|
|
dprintf_driver( stddeb, "CloseDriver(%04x, %08lX, %08lX);\n",
|
|
hDrvr, lParam1, lParam2 );
|
|
|
|
lpdrv = (LPDRIVERITEM)GlobalLock16( hDrvr );
|
|
if (lpdrv != NULL && lpdrv->dis.hDriver == hDrvr)
|
|
{
|
|
SendDriverMessage( hDrvr, DRV_CLOSE, lParam1, lParam2 );
|
|
if (--lpdrv->count == 0)
|
|
{
|
|
SendDriverMessage( hDrvr, DRV_DISABLE, lParam1, lParam2 );
|
|
SendDriverMessage( hDrvr, DRV_FREE, lParam1, lParam2 );
|
|
|
|
if (lpdrv->lpPrevItem)
|
|
lpdrv->lpPrevItem->lpNextItem = lpdrv->lpNextItem;
|
|
else
|
|
lpDrvItemList = lpdrv->lpNextItem;
|
|
if (lpdrv->lpNextItem)
|
|
lpdrv->lpNextItem->lpPrevItem = lpdrv->lpPrevItem;
|
|
|
|
FreeModule16( lpdrv->dis.hModule );
|
|
GlobalUnlock16( hDrvr );
|
|
GlobalFree16( hDrvr );
|
|
}
|
|
|
|
dprintf_driver( stddeb, "CloseDriver // hDrvr=%04x closed !\n",
|
|
hDrvr );
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* GetDriverModuleHandle [USER.254]
|
|
*/
|
|
HMODULE16 WINAPI GetDriverModuleHandle(HDRVR16 hDrvr)
|
|
{
|
|
LPDRIVERITEM lpdrv;
|
|
HMODULE16 hModule = 0;
|
|
|
|
dprintf_driver( stddeb, "GetDriverModuleHandle(%04x);\n", hDrvr);
|
|
|
|
lpdrv = (LPDRIVERITEM)GlobalLock16( hDrvr );
|
|
if (lpdrv != NULL && lpdrv->dis.hDriver == hDrvr)
|
|
{
|
|
hModule = lpdrv->dis.hModule;
|
|
GlobalUnlock16( hDrvr );
|
|
}
|
|
return hModule;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* DefDriverProc [USER.255]
|
|
*/
|
|
LRESULT WINAPI DefDriverProc(DWORD dwDevID, HDRVR16 hDriv, UINT16 wMsg,
|
|
LPARAM lParam1, LPARAM lParam2)
|
|
{
|
|
switch(wMsg)
|
|
{
|
|
case DRV_LOAD:
|
|
return (LRESULT)0L;
|
|
case DRV_FREE:
|
|
return (LRESULT)0L;
|
|
case DRV_OPEN:
|
|
return (LRESULT)0L;
|
|
case DRV_CLOSE:
|
|
return (LRESULT)0L;
|
|
case DRV_ENABLE:
|
|
return (LRESULT)0L;
|
|
case DRV_DISABLE:
|
|
return (LRESULT)0L;
|
|
case DRV_QUERYCONFIGURE:
|
|
return (LRESULT)0L;
|
|
|
|
case DRV_CONFIGURE:
|
|
MessageBox16( 0, "Driver isn't configurable !", "Wine Driver", MB_OK );
|
|
return (LRESULT)0L;
|
|
|
|
case DRV_INSTALL:
|
|
return (LRESULT)DRVCNF_RESTART;
|
|
|
|
case DRV_REMOVE:
|
|
return (LRESULT)DRVCNF_RESTART;
|
|
|
|
default:
|
|
return (LRESULT)0L;
|
|
}
|
|
}
|
|
|
|
/**************************************************************************
|
|
* GetDriverInfo [USER.256]
|
|
*/
|
|
BOOL16 WINAPI GetDriverInfo(HDRVR16 hDrvr, LPDRIVERINFOSTRUCT16 lpDrvInfo)
|
|
{
|
|
LPDRIVERITEM lpdrv;
|
|
|
|
dprintf_driver( stddeb, "GetDriverInfo(%04x, %p);\n", hDrvr, lpDrvInfo );
|
|
|
|
if (lpDrvInfo == NULL) return FALSE;
|
|
|
|
lpdrv = (LPDRIVERITEM)GlobalLock16( hDrvr );
|
|
if (lpdrv == NULL) return FALSE;
|
|
memcpy( lpDrvInfo, &lpdrv->dis, sizeof(DRIVERINFOSTRUCT16) );
|
|
GlobalUnlock16( hDrvr );
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* GetNextDriver [USER.257]
|
|
*/
|
|
HDRVR16 WINAPI GetNextDriver(HDRVR16 hDrvr, DWORD dwFlags)
|
|
{
|
|
LPDRIVERITEM lpdrv;
|
|
HDRVR16 hRetDrv = 0;
|
|
|
|
dprintf_driver( stddeb, "GetNextDriver(%04x, %08lX);\n", hDrvr, dwFlags );
|
|
|
|
if (hDrvr == 0)
|
|
{
|
|
if (lpDrvItemList == NULL)
|
|
{
|
|
dprintf_driver(stddeb, "GetNextDriver // drivers list empty !\n");
|
|
LoadStartupDrivers();
|
|
if (lpDrvItemList == NULL) return 0;
|
|
}
|
|
dprintf_driver( stddeb,"GetNextDriver // return first %04x !\n",
|
|
lpDrvItemList->dis.hDriver );
|
|
return lpDrvItemList->dis.hDriver;
|
|
}
|
|
|
|
lpdrv = (LPDRIVERITEM)GlobalLock16( hDrvr );
|
|
if (lpdrv != NULL)
|
|
{
|
|
if (dwFlags & GND_REVERSE)
|
|
{
|
|
if (lpdrv->lpPrevItem)
|
|
hRetDrv = lpdrv->lpPrevItem->dis.hDriver;
|
|
}
|
|
else
|
|
{
|
|
if (lpdrv->lpNextItem)
|
|
hRetDrv = lpdrv->lpNextItem->dis.hDriver;
|
|
}
|
|
GlobalUnlock16( hDrvr );
|
|
}
|
|
|
|
dprintf_driver( stddeb, "GetNextDriver // return %04x !\n", hRetDrv );
|
|
return hRetDrv;
|
|
}
|