Commit 3a0f8b79 authored by Alexandre Julliard's avatar Alexandre Julliard

Finished separation of shell32 and wsock32.

parent 1ec253d2
......@@ -945,9 +945,12 @@ debug_channels (comm debugstr dll int resource stress thunk toolhelp win32)
@ stdcall FindResource16(long str str) FindResource16
@ stdcall FreeResource16(long) FreeResource16
@ stdcall GetCurrentTask() GetCurrentTask
@ stdcall GetDOSEnvironment16() GetDOSEnvironment16
@ stdcall GetModuleFileName16(long ptr long) GetModuleFileName16
@ stdcall GetModuleHandle16(str) GetModuleHandle16
@ stdcall LoadResource16(long long) LoadResource16
@ stdcall LockResource16(long) LockResource16
@ stdcall WinExec16(str long) WinExec16
################################################################
# Wine internal extensions
......@@ -965,3 +968,6 @@ debug_channels (comm debugstr dll int resource stress thunk toolhelp win32)
@ stdcall wine_call_to_16_long(ptr long) wine_call_to_16_long
@ stdcall wine_call_to_16_regs_short(ptr long) wine_call_to_16_regs_short
@ stdcall wine_call_to_16_regs_long (ptr long) wine_call_to_16_regs_long
# Unix files
@ stdcall wine_get_unix_file_name(str ptr long) wine_get_unix_file_name
......@@ -5,7 +5,6 @@ VPATH = @srcdir@
MODULE = shell32
ALTNAMES = shell
EXTRALIBS = -lwine_unicode
IMPORTS = user32 gdi32 kernel32 ntdll
LDDLLFLAGS = @LDDLLFLAGS@
SYMBOLFILE = $(MODULE).tmp.o
......
......@@ -785,7 +785,7 @@ LRESULT WINAPI ShellHookProc16(INT16 code, WPARAM16 wParam, LPARAM lParam)
case HSHELL_WINDOWDESTROYED: uMsg = uMsgWndDestroyed; break;
case HSHELL_ACTIVATESHELLWINDOW: uMsg = uMsgShellActivate;
}
PostMessage16( SHELL_hWnd, uMsg, wParam, 0 );
PostMessageA( SHELL_hWnd, uMsg, wParam, 0 );
}
return CallNextHookEx16( WH_SHELL, code, wParam, lParam );
}
......@@ -825,3 +825,25 @@ BOOL WINAPI RegisterShellHook16(HWND16 hWnd, UINT16 uAction)
}
return FALSE;
}
/***********************************************************************
* DriveType16 (SHELL.262)
*/
UINT16 WINAPI DriveType16( UINT16 drive )
{
UINT ret;
char path[] = "A:\\";
path[0] += drive;
ret = GetDriveTypeA(path);
switch(ret) /* some values are not supported in Win16 */
{
case DRIVE_CDROM:
ret = DRIVE_REMOTE;
break;
case DRIVE_DOESNOTEXIST:
ret = DRIVE_CANNOTDETERMINE;
break;
}
return ret;
}
......@@ -36,7 +36,7 @@ owner shell32
157 stub RESTARTDIALOG
# 166 PICKICONDLG
262 pascal16 DriveType(long) GetDriveType16
262 pascal16 DriveType(long) DriveType16
# 263 SH16TO32DRIVEIOCTL
# 264 SH16TO32INT2526
......
......@@ -8,11 +8,11 @@ import ole32.dll
import shlwapi.dll
import comctl32.dll
#import user32.dll
#import gdi32.dll
#import advapi32.dll
#import kernel32.dll
#import ntdll.dll
import user32.dll
import gdi32.dll
import advapi32.dll
import kernel32.dll
import ntdll.dll
debug_channels (exec pidl shell)
......
......@@ -646,6 +646,7 @@ BOOL WINAPI AboutDlgProc( HWND hWnd, UINT msg, WPARAM wParam,
}
break;
#if 0 /* FIXME: should use DoDragDrop */
case WM_LBTRACKPOINT:
hWndCtl = GetDlgItem(hWnd, IDC_LISTBOX);
if( (INT16)GetKeyState( VK_CONTROL ) < 0 )
......@@ -670,6 +671,7 @@ BOOL WINAPI AboutDlgProc( HWND hWnd, UINT msg, WPARAM wParam,
}
}
break;
#endif
case WM_QUERYDROPOBJECT:
if( wParam == 0 )
......
......@@ -19,6 +19,7 @@
#include "winerror.h"
#include "winbase.h"
#include "winnls.h"
#include "winreg.h"
#include "shlobj.h"
#include "wine/undocshell.h"
......@@ -28,8 +29,6 @@
#include "pidl.h"
#include "shell32_main.h"
#include "shlguid.h"
#include "file.h"
#include "options.h"
DEFAULT_DEBUG_CHANNEL(shell);
......@@ -450,10 +449,10 @@ static int ExtractFromICO(const char *szFileName, const char *szXPMFileName)
/* get the Unix file name for a given path, allocating the string */
inline static char *get_unix_file_name( const char *dos )
{
DOS_FULL_NAME path;
char buffer[MAX_PATH];
if (!DOSFS_GetFullName( dos, FALSE, &path )) return NULL;
return HEAP_strdupA( GetProcessHeap(), 0, path.long_name );
if (!wine_get_unix_file_name( dos, buffer, sizeof(buffer) )) return NULL;
return HEAP_strdupA( GetProcessHeap(), 0, buffer );
}
static BOOL create_default_icon( const char *filename )
......@@ -493,6 +492,7 @@ static HRESULT WINAPI IPersistFile_fnSave(IPersistFile* iface, LPCOLESTR pszFile
char *path_name = NULL;
char *work_dir = NULL;
BOOL bDesktop;
HKEY hkey;
_ICOM_THIS_From_IPersistFile(IShellLinkImpl, iface);
......@@ -507,7 +507,14 @@ static HRESULT WINAPI IPersistFile_fnSave(IPersistFile* iface, LPCOLESTR pszFile
if (strcasecmp( p, ".exe" )) return NOERROR;
/* check if ShellLinker configured */
PROFILE_GetWineIniString( "wine", "ShellLinker", "", buffer, sizeof(buffer) );
buffer[0] = 0;
if (!RegOpenKeyExA( HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\Wine",
0, KEY_ALL_ACCESS, &hkey ))
{
DWORD type, count = sizeof(buffer);
if (RegQueryValueExA( hkey, "ShellLinker", 0, &type, buffer, &count )) buffer[0] = 0;
RegCloseKey( hkey );
}
if (!*buffer) return NOERROR;
shell_link_app = HEAP_strdupA( GetProcessHeap(), 0, buffer );
......
......@@ -7,7 +7,6 @@
#include "winreg.h"
#include "debugtools.h"
#include "winnls.h"
#include "heap.h"
#include "shellapi.h"
#include "shlobj.h"
......@@ -126,3 +125,86 @@ HRESULT WINAPI SHRegCloseKey (HKEY hkey)
TRACE("0x%04x\n",hkey);
return RegCloseKey( hkey );
}
/* 16-bit functions */
/* 0 and 1 are valid rootkeys in win16 shell.dll and are used by
* some programs. Do not remove those cases. -MM
*/
static inline void fix_win16_hkey( HKEY *hkey )
{
if (*hkey == 0 || *hkey == 1) *hkey = HKEY_CLASSES_ROOT;
}
/******************************************************************************
* RegOpenKey16 [SHELL.1]
*/
DWORD WINAPI RegOpenKey16( HKEY hkey, LPCSTR name, LPHKEY retkey )
{
fix_win16_hkey( &hkey );
return RegOpenKeyA( hkey, name, retkey );
}
/******************************************************************************
* RegCreateKey16 [SHELL.2]
*/
DWORD WINAPI RegCreateKey16( HKEY hkey, LPCSTR name, LPHKEY retkey )
{
fix_win16_hkey( &hkey );
return RegCreateKeyA( hkey, name, retkey );
}
/******************************************************************************
* RegCloseKey16 [SHELL.3]
*/
DWORD WINAPI RegCloseKey16( HKEY hkey )
{
fix_win16_hkey( &hkey );
return RegCloseKey( hkey );
}
/******************************************************************************
* RegDeleteKey16 [SHELL.4]
*/
DWORD WINAPI RegDeleteKey16( HKEY hkey, LPCSTR name )
{
fix_win16_hkey( &hkey );
return RegDeleteKeyA( hkey, name );
}
/******************************************************************************
* RegSetValue16 [SHELL.5]
*/
DWORD WINAPI RegSetValue16( HKEY hkey, LPCSTR name, DWORD type, LPCSTR data, DWORD count )
{
fix_win16_hkey( &hkey );
return RegSetValueA( hkey, name, type, data, count );
}
/******************************************************************************
* RegQueryValue16 [SHELL.6]
*
* NOTES
* Is this HACK still applicable?
*
* HACK
* The 16bit RegQueryValue doesn't handle selectorblocks anyway, so we just
* mask out the high 16 bit. This (not so much incidently) hopefully fixes
* Aldus FH4)
*/
DWORD WINAPI RegQueryValue16( HKEY hkey, LPCSTR name, LPSTR data, LPDWORD count )
{
fix_win16_hkey( &hkey );
if (count) *count &= 0xffff;
return RegQueryValueA( hkey, name, data, count );
}
/******************************************************************************
* RegEnumKey16 [SHELL.7]
*/
DWORD WINAPI RegEnumKey16( HKEY hkey, DWORD index, LPSTR name, DWORD name_len )
{
fix_win16_hkey( &hkey );
return RegEnumKeyA( hkey, index, name, name_len );
}
......@@ -656,9 +656,11 @@ debug_channels (accel caret class clipboard combo cursor dc ddeml dialog driver
################################################################
# Wine extensions: Win16 functions that are needed by other dlls
#
@ stdcall CallNextHookEx16(long long long long) CallNextHookEx16
@ stdcall CallWindowProc16(long long long long long) CallWindowProc16
@ stdcall CreateDialogIndirectParam16(long ptr long long long) CreateDialogIndirectParam16
@ stdcall DialogBoxIndirectParam16(long long long long long) DialogBoxIndirectParam16
@ stdcall SetWindowsHookEx16(long long long long) SetWindowsHookEx16
################################################################
# Wine extensions: extra useful functions not exported under Windows
......
......@@ -146,9 +146,6 @@ typedef struct /* WSAAsyncSelect() control struct */
typedef struct _WSINFO
{
DWORD dwThisProcess;
struct _WSINFO *lpNextIData;
unsigned flags;
INT16 num_startup; /* reference counter */
INT16 num_async_rq;
......@@ -326,44 +323,16 @@ static int _get_sock_error(SOCKET s, unsigned int bit)
return ret;
}
static LPWSINFO lpFirstIData = NULL;
static WSINFO wsinfo;
static LPWSINFO WINSOCK_GetIData(void)
inline static LPWSINFO WINSOCK_GetIData(void)
{
DWORD pid = GetCurrentProcessId();
LPWSINFO iData;
for (iData = lpFirstIData; iData; iData = iData->lpNextIData) {
if (iData->dwThisProcess == pid)
break;
}
return iData;
}
static BOOL WINSOCK_CreateIData(void)
{
LPWSINFO iData;
iData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WSINFO));
if (!iData)
return FALSE;
iData->dwThisProcess = GetCurrentProcessId();
iData->lpNextIData = lpFirstIData;
lpFirstIData = iData;
return TRUE;
return &wsinfo;
}
static void WINSOCK_DeleteIData(void)
{
LPWSINFO iData = WINSOCK_GetIData();
LPWSINFO* ppid;
if (iData) {
for (ppid = &lpFirstIData; *ppid; ppid = &(*ppid)->lpNextIData) {
if (*ppid == iData) {
*ppid = iData->lpNextIData;
break;
}
}
if( iData->flags & WSI_BLOCKINGCALL )
TRACE("\tinside blocking call!\n");
......@@ -374,7 +343,6 @@ static void WINSOCK_DeleteIData(void)
if( iData->dbuffer ) SEGPTR_FREE(iData->dbuffer);
HeapFree(GetProcessHeap(), 0, iData);
}
}
/***********************************************************************
......@@ -392,21 +360,6 @@ BOOL WINAPI WSOCK32_LibMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID fImpLoad
}
/***********************************************************************
* WINSOCK_LibMain (WINSOCK.init)
*/
BOOL WINAPI WINSOCK_LibMain(DWORD fdwReason, HINSTANCE hInstDLL, WORD ds,
WORD wHeapSize, DWORD dwReserved1, WORD wReserved2)
{
TRACE("0x%x 0x%lx\n", hInstDLL, fdwReason);
switch (fdwReason) {
case DLL_PROCESS_DETACH:
WINSOCK_DeleteIData();
break;
}
return TRUE;
}
/***********************************************************************
* convert_sockopt()
*
* Converts socket flags from Windows format.
......@@ -650,12 +603,6 @@ INT16 WINAPI WSAStartup16(UINT16 wVersionRequested, LPWSADATA lpWSAData)
if( _WSHeap == 0 ) return WSASYSNOTREADY;
pwsi = WINSOCK_GetIData();
if( pwsi == NULL )
{
WINSOCK_CreateIData();
pwsi = WINSOCK_GetIData();
if (!pwsi) return WSASYSNOTREADY;
}
pwsi->num_startup++;
/* return winsock information */
......@@ -711,12 +658,6 @@ INT WINAPI WSAStartup(UINT wVersionRequested, LPWSADATA lpWSAData)
if( _WSHeap == 0 ) return WSASYSNOTREADY;
pwsi = WINSOCK_GetIData();
if( pwsi == NULL )
{
WINSOCK_CreateIData();
pwsi = WINSOCK_GetIData();
if (!pwsi) return WSASYSNOTREADY;
}
pwsi->num_startup++;
/* return winsock information */
......@@ -2833,23 +2774,6 @@ INT16 WINAPI WSAAsyncSelect16(SOCKET16 s, HWND16 hWnd, UINT16 wMsg, LONG lEvent)
}
/***********************************************************************
* WSARecvEx() (WSOCK32.1107)
*
* WSARecvEx is a Microsoft specific extension to winsock that is identical to recv
* except that has an in/out argument call flags that has the value MSG_PARTIAL ored
* into the flags parameter when a partial packet is read. This only applies to
* sockets using the datagram protocol. This method does not seem to be implemented
* correctly by microsoft as the winsock implementation does not set the MSG_PARTIAL
* flag when a fragmented packet arrives.
*/
INT WINAPI WSARecvEx(SOCKET s, char *buf, INT len, INT *flags) {
FIXME("(WSARecvEx) partial packet return value not set \n");
return WSOCK32_recv(s, buf, len, *flags);
}
/***********************************************************************
* WSARecvEx16() (WINSOCK.1107)
*
* See description for WSARecvEx()
......
......@@ -61,5 +61,3 @@ owner ws2_32
116 pascal WSACleanup() WSACleanup
151 pascal16 __WSAFDIsSet(word ptr) __WSAFDIsSet16
1107 pascal16 WSARecvEx(word ptr word ptr) WSARecvEx16
1999 pascal DllEntryPoint(long word word word long word) WINSOCK_LibMain
......@@ -3,8 +3,9 @@ TOPOBJDIR = ../..
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = wsock32
SOVERSION = 1.0
IMPORTS = ws2_32 kernel32 ntdll
LDDLLFLAGS = @LDDLLFLAGS@
SYMBOLFILE = $(MODULE).tmp.o
C_SRCS = socket.c
......
......@@ -8,6 +8,7 @@
#include <sys/types.h>
#include "windef.h"
#include "winbase.h"
#include "debugtools.h"
#include "winsock2.h"
#include "winnt.h"
......@@ -26,6 +27,7 @@
DEFAULT_DEBUG_CHANNEL(winsock);
static INT (WINAPI *WS2_recv)(SOCKET s, char *buf, INT len, INT flags);
/***********************************************************************
* WsControl()
......@@ -682,6 +684,21 @@ int WSCNTL_GetTransRecvStat(int intNumber, unsigned long *transBytes, unsigned l
}
/***********************************************************************
* WSARecvEx() (WSOCK32.1107)
*
* WSARecvEx is a Microsoft specific extension to winsock that is identical to recv
* except that has an in/out argument call flags that has the value MSG_PARTIAL ored
* into the flags parameter when a partial packet is read. This only applies to
* sockets using the datagram protocol. This method does not seem to be implemented
* correctly by microsoft as the winsock implementation does not set the MSG_PARTIAL
* flag when a fragmented packet arrives.
*/
INT WINAPI WSARecvEx(SOCKET s, char *buf, INT len, INT *flags)
{
FIXME("(WSARecvEx) partial packet return value not set \n");
return WS2_recv(s, buf, len, *flags);
}
/***********************************************************************
......@@ -692,3 +709,31 @@ void WINAPI WS_s_perror(LPCSTR message)
FIXME("(%s): stub\n",message);
return;
}
/***********************************************************************
* WSOCK_LibMain
*/
BOOL WINAPI WSOCK_LibMain( HINSTANCE inst, DWORD reason, LPVOID reserved )
{
static HMODULE ws2_32;
switch (reason)
{
case DLL_PROCESS_ATTACH:
/* we import ws2_32 by hand, because we don't want to implicitly */
/* link to it; otherwise Unix calls like socket() get redirected */
/* to ws2_32.dll and this is not what we want. */
if (!(ws2_32 = LoadLibraryA( "ws2_32.dll" )))
{
ERR("could not load ws2_32\n" );
return FALSE;
}
WS2_recv = (void *)GetProcAddress( ws2_32, "recv" );
break;
case DLL_PROCESS_DETACH:
FreeLibrary( ws2_32 );
break;
}
return TRUE;
}
name wsock32
type win32
init WSOCK_LibMain
import ws2_32.dll
import kernel32.dll
import ntdll.dll
......
......@@ -1366,6 +1366,21 @@ DWORD WINAPI GetFullPathNameW( LPCWSTR name, DWORD len, LPWSTR buffer,
return ret;
}
/***********************************************************************
* wine_get_unix_file_name (Not a Windows API, but exported from KERNEL32)
*
* Return the full Unix file name for a given path.
*/
BOOL WINAPI wine_get_unix_file_name( LPCSTR dos, LPSTR buffer, DWORD len )
{
BOOL ret;
DOS_FULL_NAME path;
if ((ret = DOSFS_GetFullName( dos, FALSE, &path ))) lstrcpynA( buffer, dos, len );
return ret;
}
/***********************************************************************
* DOSFS_FindNextEx
*/
......
......@@ -1894,6 +1894,12 @@ DWORD WINAPI _ConfirmSysLevel(SYSLEVEL*);
VOID WINAPI _EnterSysLevel(SYSLEVEL*);
VOID WINAPI _LeaveSysLevel(SYSLEVEL*);
/* Wine internal functions */
BOOL WINAPI wine_get_unix_file_name( LPCSTR dos, LPSTR buffer, DWORD len );
/* a few optimizations for i386/gcc */
#if defined(__i386__) && defined(__GNUC__)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment