Release 960705

Fri Jul  5 16:27:43 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [controls/desktop.c]
	Use Windows file I/O routines to load the desktop bitmap.

	* [files/file.c]
	Implemented RemoveDirectory* and DeleteFile*.

	* [include/wine.h]
	Added SIGCONTEXT typedef to replace #define sigcontext_struct.

	* [loader/task.c]
	Fixed initial breakpoint setting for Win32 tasks.

	* [misc/wsprintf.c]
	Ignore Unicode formats for wsprintf16().

	* [objects/font.c]
	Implemented Win32 version of GetTextMetrics.

	* [windows/winproc.c] [windows/win.c] [windows/class.c]
	  [windows/dialog.c]
	Modified windows procedures to use thunks, to ensure that the
	procedure can be called directly from the Windows program.

	* [windows/win.c]
	Added function WIN_BuildWinArray() to make it easier to enumerate
	windows. Implemented Win32 version of EnumWindows() and friends.

Fri Jul  5 11:56:22 1996  Andreas Kirschbaum <ank@rbg.informatik.th-darmstadt.de>

	* [controls/button.c] [windows/win.c]
	Operator precedence fixes.

	* [controls/edit.c]
	Implemented ES_PASSWORD, ES_LOWERCASE and ES_UPPERCASE styles.
	Fixed word wrap with long words.

	* [debugger/debug.l]
	New alias "where" for command "backtrace".

	* [if1632/gdi.spec]
	Corrected parameter of ExtTextOut.

	* [loader/module.c]
	Corrected printing of table of modules.

	* [misc/spy.c]
	Removed superfluous \n in message name.

	* [windows/message.c]
	Declared MSG_SendMessage as static.
	Changed parameter of DirectedYield() from queue handle to task handle.
	Removed warning mesages for argument of printf.

	* [windows/nonclient.c]
	Added the flag DT_NOPREFIX when drawing window titles.

	* [windows/win.c]
	WIN_WalkWindows now prints the invalid window handle.
	Added a warning if Get-/SetWindowWord/-Long gets an invalid offset.

	* [windows/winproc.c]
	Allows creating dialog windows with NULL as dialog function.

Wed Jul  3 09:26:41 1996  Andrew Lewycky <plewycky@oise.utoronto.ca>

	* [windows/event.c]
	EVENT_key: Fixes to VK_ code generation for space bar and
	punctuation.

	* [files/file.c]
	GetTempFileName: first character in temporary name is "~".

	* [memory/heap.c]
	HEAP_MakeInUseBlockFree now frees the whole subheap if possible.

	* [objects/text.c]
	ExtTextOut16(): handle NULL lpRect and ETO_OPAQUE.

	* [misc/driver.c]
	Removed some bugs and reformatted. Actually loads drivers now.

	* [include/callback.h]
	Added CallDriverProc() and CallWindowsExitProc().

	* [loader/module.c]
	MODULE_CallWEP(): new function.

	* [misc/lzexpand.c]
	LZSeek(): return new pointer, not old one.

	* [misc/ver.c]
	find_ne_resource(): fixed dependence on LZSeek() bug.
	GetFileResource(): initialize reslen before using it.

	* [windows/class.c]
	SetClassWord(): add missing else.

	* [objects/font.c]
	lpFontList is now MAX_FONTS+1. It used to overwrite the array.
	InitFontList: allocate one huge array of structures.
	FONT_MatchFont: uppercase the face name.

Thu Jun 27 12:41:40 1996  Bruce Milner <bruce@genetics.utah.edu>

	* [memory/heap.c]
	Fixed a typo in HeapReAlloc().

Tue Jun 25 22:22:03 1996  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [files/directory.c] [files/drive.c] [if1632/kernel.spec]
	  [if1632/kernel32.spec] [if1632/shell.spec] [include/windows.h]
	GetTempPath* added
	GetDriveType* fixed, updated to NewNameStandard.
	GetCurrentDirectory* fixed (needs to prepend X:\).

	* [controls/listbox.c]
	Missing NULL check added.

	* [if1632/winmm.spec] [loader/builtin.c]
	winmm.dll (32bit mmsystem equivalent) specs added.

	* [memory/string.c] [if1632/kernel32.spec] [include/windows.h]
	Rtl{Move,Zero,Fill}Memory added.

	* [misc/registry.c]
	Some NULL ptr dereference bugs fixed.

	* [multimedia/mcicda.c][multimedia/mcistring.c][multimedia/mmsystem.c]
	Check for NULL ptr.
	Fill mciOpenDrv when mixing mciOpen and mciSendString("open ..").
	Aliasing should work for all MCI devices.

	* [windows/win.c]
	Allow passing invalid window handles to CloseWindow().

Tue Jun 25 20:02:15 1996  Jukka Iivonen <iivonen@cc.helsinki.fi>

	* [files/directory.c] [if1632/kernel32.spec]
	GetSystemDirectory32A and GetSystemDirectory32W added.

	* [misc/main.c] [if1632/kernel32.spec]
	Beep and SetEnvironmentVariable32W added.
diff --git a/misc/driver.c b/misc/driver.c
index eb51ba9..6277f8a 100644
--- a/misc/driver.c
+++ b/misc/driver.c
@@ -2,14 +2,14 @@
  * Wine Drivers functions
  *
  * Copyright 1994 Martin Ayotte
-static char Copyright[] = "Copyright  Martin Ayotte, 1994";
 */
 
 #include <stdio.h>
 #include "windows.h"
 #include "win.h"
-#include "user.h"
+#include "callback.h"
 #include "driver.h"
+#include "module.h"
 #include "stddebug.h"
 #include "debug.h"
 
@@ -17,205 +17,294 @@
 
 void LoadStartupDrivers(void)
 {
-	HDRVR	hDrv;
-	char	str[256];
-	LPSTR	ptr	= str;
-	LPSTR	file = "SYSTEM.INI";
-	if (GetPrivateProfileString("drivers", NULL, 
-		"", str, sizeof(str), file) < 2) {
-        	fprintf(stderr,
-		"LoadStartupDrivers // can't find drivers section in '%s'\n", 
-		file);
-		return;
-		}
-	while(strlen(ptr) != 0) {
-        	dprintf_driver(stddeb,"LoadStartupDrivers // str='%s'\n", ptr);
-		hDrv = OpenDriver(ptr, "drivers", 0L);
-        	dprintf_driver(stddeb,
-			"LoadStartupDrivers // hDrv=%04x\n", hDrv);
-		ptr += strlen(ptr) + 1;
-		}
-    	dprintf_driver(stddeb,"LoadStartupDrivers // end of list !\n");
+    HDRVR16 hDrv;
+    char  str[256];
+    LPSTR ptr;
+
+    if (GetPrivateProfileString( "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 SendDriverMessage(HDRVR hDriver, WORD msg, LPARAM lParam1, LPARAM lParam2)
+LRESULT SendDriverMessage(HDRVR16 hDriver, UINT16 msg, LPARAM lParam1,
+			  LPARAM lParam2)
 {
-	dprintf_driver(stdnimp,"SendDriverMessage(%04x, %04X, %08lX, %08lX);\n",
-						hDriver, msg, lParam1, lParam2);
-        return 0;
+    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 = CallDriverProc( lpdrv->lpDrvProc, 0L /* FIXME */, hDriver, msg,
+			     lParam1, lParam2 );
+
+    dprintf_driver( stddeb, "SendDriverMessage // retval = %ld\n", retval );
+
+    GlobalUnlock16( hDriver );
+    return retval;
 }
 
 /**************************************************************************
  *				OpenDriver		        [USER.252]
  */
-HDRVR OpenDriver(LPSTR lpDriverName, LPSTR lpSectionName, LPARAM lParam)
+HDRVR16 OpenDriver(LPSTR lpDriverName, LPSTR lpSectionName, LPARAM lParam)
 {
-	HDRVR			hDrvr;
-	LPDRIVERITEM	lpnewdrv;
-	LPDRIVERITEM	lpdrv = lpDrvItemList;
-	char			DrvName[128];
-    	dprintf_driver(stddeb,"OpenDriver('%s', '%s', %08lX);\n",
-		lpDriverName, lpSectionName, lParam);
-	if (lpSectionName == NULL) lpSectionName = "drivers";
-	GetPrivateProfileString(lpSectionName, lpDriverName,
-		"", DrvName, sizeof(DrvName), "SYSTEM.INI");
-    	dprintf_driver(stddeb,"OpenDriver // DrvName='%s'\n", DrvName);
-	if (strlen(DrvName) < 1) return 0;
-	while (lpdrv != NULL) {
-		if (lpdrv->lpNextItem == NULL) break;
-		lpdrv = lpdrv->lpNextItem;
-		}
-	hDrvr = GlobalAlloc16(GMEM_MOVEABLE, sizeof(DRIVERITEM));
-	lpnewdrv = (LPDRIVERITEM) GlobalLock16(hDrvr);
-	if (lpnewdrv == NULL) return 0;
-	lpnewdrv->dis.length = sizeof(DRIVERINFOSTRUCT);
-	lpnewdrv->dis.hModule = 0;
-/*	lpnewdrv->dis.hModule = LoadImage(DrvName, DLL, 0);
-	if (lpnewdrv->dis.hModule == 0) {
-		GlobalUnlock(hDrvr);
-		GlobalFree(hDrvr);
-		return 0;
-		} */
-	lpnewdrv->dis.hDriver = hDrvr;
-	strcpy(lpnewdrv->dis.szAliasName, lpDriverName);
-	lpnewdrv->count = 0;
-	lpnewdrv->lpNextItem = NULL;
-	if (lpDrvItemList == NULL || lpdrv == NULL) {
-		lpDrvItemList = lpnewdrv;
-		lpnewdrv->lpPrevItem = NULL;
-		}
-	else {
-		lpdrv->lpNextItem = lpnewdrv;
-		lpnewdrv->lpPrevItem = lpdrv;
-		}
-	lpnewdrv->lpDrvProc = (DRIVERPROC)NULL;
-    	dprintf_driver(stddeb,"OpenDriver // hDrvr=%04x loaded !\n", hDrvr);
-	return hDrvr;
+    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";
+    GetPrivateProfileString( 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 = LoadModule( 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 = 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 CloseDriver(HDRVR hDrvr, LPARAM lParam1, LPARAM lParam2)
+LRESULT 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) {
-		if (lpdrv->lpPrevItem)
-			((LPDRIVERITEM)lpdrv->lpPrevItem)->lpNextItem = lpdrv->lpNextItem;
-		if (lpdrv->lpNextItem)
-			((LPDRIVERITEM)lpdrv->lpNextItem)->lpPrevItem = lpdrv->lpPrevItem;
-		GlobalUnlock16(hDrvr);
-		GlobalFree16(hDrvr);
-        dprintf_driver(stddeb,"CloseDriver // hDrvr=%04x closed !\n", hDrvr);
-		return TRUE;
-		}
-	return FALSE;
+    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]
  */
-HANDLE GetDriverModuleHandle(HDRVR hDrvr)
+HMODULE16 GetDriverModuleHandle(HDRVR16 hDrvr)
 {
-	LPDRIVERITEM	lpdrv;
-	HANDLE			hModule = 0;
-    	dprintf_driver(stddeb,"GetDriverModuleHandle(%04x);\n", hDrvr);
-	lpdrv = (LPDRIVERITEM) GlobalLock16(hDrvr);
-	if (lpdrv != NULL) {
-		hModule = lpdrv->dis.hModule;
-		GlobalUnlock16(hDrvr);
-		}
-	return hModule;
+    LPDRIVERITEM lpdrv;
+    HMODULE 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 DefDriverProc(DWORD dwDevID, HDRVR hDriv, WORD wMsg, 
-						DWORD dwParam1, DWORD dwParam2)
+LRESULT DefDriverProc(DWORD dwDevID, HDRVR 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:
-			MessageBox((HWND)NULL, "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;
-		}
+    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:
+	MessageBox( (HWND)NULL, "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]
  */
-BOOL GetDriverInfo(HDRVR hDrvr, LPDRIVERINFOSTRUCT lpDrvInfo)
+BOOL16 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(DRIVERINFOSTRUCT));
-	GlobalUnlock16(hDrvr);
-	return TRUE;
+    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]
  */
-HDRVR GetNextDriver(HDRVR hDrvr, DWORD dwFlags)
+HDRVR16 GetNextDriver(HDRVR16 hDrvr, DWORD dwFlags)
 {
-	LPDRIVERITEM	lpdrv;
-	HDRVR			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 = ((LPDRIVERITEM)lpdrv->lpPrevItem)->dis.hDriver;
-			}
-		else {
-			if (lpdrv->lpNextItem) 
-				hRetDrv = ((LPDRIVERITEM)lpdrv->lpNextItem)->dis.hDriver;
-			}
-		GlobalUnlock16(hDrvr);
-		}
-    	dprintf_driver(stddeb,"GetNextDriver // return %04x !\n", hRetDrv);
-	return hRetDrv;
+    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;
 }
-
-