mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-31 12:19:49 +00:00
152 lines
4.9 KiB
C
152 lines
4.9 KiB
C
/*
|
|
* IFSMGR VxD implementation
|
|
*
|
|
* Copyright 1998 Marcus Meissner
|
|
* Copyright 1998 Ulrich Weigand
|
|
* Copyright 1998 Patrik Stridvall
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
/* NOTES
|
|
* These ioctls are used by 'MSNET32.DLL'.
|
|
*
|
|
* I have been unable to uncover any documentation about the ioctls so
|
|
* the implementation of the cases IFS_IOCTL_21 and IFS_IOCTL_2F are
|
|
* based on reasonable guesses on information found in the Windows 95 DDK.
|
|
*/
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include "windef.h"
|
|
#include "winbase.h"
|
|
#include "wine/debug.h"
|
|
|
|
WINE_DEFAULT_DEBUG_CHANNEL(vxd);
|
|
|
|
/*
|
|
* IFSMgr DeviceIO service
|
|
*/
|
|
|
|
#define IFS_IOCTL_21 100
|
|
#define IFS_IOCTL_2F 101
|
|
#define IFS_IOCTL_GET_RES 102
|
|
#define IFS_IOCTL_GET_NETPRO_NAME_A 103
|
|
|
|
struct win32apireq {
|
|
unsigned long ar_proid;
|
|
unsigned long ar_eax;
|
|
unsigned long ar_ebx;
|
|
unsigned long ar_ecx;
|
|
unsigned long ar_edx;
|
|
unsigned long ar_esi;
|
|
unsigned long ar_edi;
|
|
unsigned long ar_ebp;
|
|
unsigned short ar_error;
|
|
unsigned short ar_pad;
|
|
};
|
|
|
|
static void win32apieq_2_CONTEXT(const struct win32apireq *pIn, CONTEXT *pCxt)
|
|
{
|
|
memset(pCxt,0,sizeof(*pCxt));
|
|
|
|
pCxt->ContextFlags=CONTEXT_INTEGER|CONTEXT_CONTROL;
|
|
pCxt->Eax = pIn->ar_eax;
|
|
pCxt->Ebx = pIn->ar_ebx;
|
|
pCxt->Ecx = pIn->ar_ecx;
|
|
pCxt->Edx = pIn->ar_edx;
|
|
pCxt->Esi = pIn->ar_esi;
|
|
pCxt->Edi = pIn->ar_edi;
|
|
|
|
/* FIXME: Only partial CONTEXT_CONTROL */
|
|
pCxt->Ebp = pIn->ar_ebp;
|
|
|
|
/* FIXME: pIn->ar_proid ignored */
|
|
/* FIXME: pIn->ar_error ignored */
|
|
/* FIXME: pIn->ar_pad ignored */
|
|
}
|
|
|
|
static void CONTEXT_2_win32apieq(const CONTEXT *pCxt, struct win32apireq *pOut)
|
|
{
|
|
memset(pOut,0,sizeof(struct win32apireq));
|
|
|
|
pOut->ar_eax = pCxt->Eax;
|
|
pOut->ar_ebx = pCxt->Ebx;
|
|
pOut->ar_ecx = pCxt->Ecx;
|
|
pOut->ar_edx = pCxt->Edx;
|
|
pOut->ar_esi = pCxt->Esi;
|
|
pOut->ar_edi = pCxt->Edi;
|
|
|
|
/* FIXME: Only partial CONTEXT_CONTROL */
|
|
pOut->ar_ebp = pCxt->Ebp;
|
|
|
|
/* FIXME: pOut->ar_proid ignored */
|
|
/* FIXME: pOut->ar_error ignored */
|
|
/* FIXME: pOut->ar_pad ignored */
|
|
}
|
|
|
|
extern void __wine_call_int_handler( CONTEXT *context, BYTE intnum );
|
|
|
|
/***********************************************************************
|
|
* DeviceIoControl (IFSMGR.VXD.@)
|
|
*/
|
|
BOOL WINAPI IFSMGR_DeviceIoControl(DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbInBuffer,
|
|
LPVOID lpvOutBuffer, DWORD cbOutBuffer,
|
|
LPDWORD lpcbBytesReturned,
|
|
LPOVERLAPPED lpOverlapped)
|
|
{
|
|
TRACE("(%d,%p,%d,%p,%d,%p,%p): stub\n",
|
|
dwIoControlCode, lpvInBuffer,cbInBuffer, lpvOutBuffer,cbOutBuffer,
|
|
lpcbBytesReturned, lpOverlapped);
|
|
|
|
switch (dwIoControlCode)
|
|
{
|
|
case IFS_IOCTL_21:
|
|
case IFS_IOCTL_2F:
|
|
{
|
|
CONTEXT cxt;
|
|
struct win32apireq *pIn=lpvInBuffer;
|
|
struct win32apireq *pOut=lpvOutBuffer;
|
|
|
|
TRACE( "Control '%s': "
|
|
"proid=0x%08lx, eax=0x%08lx, ebx=0x%08lx, ecx=0x%08lx, "
|
|
"edx=0x%08lx, esi=0x%08lx, edi=0x%08lx, ebp=0x%08lx, "
|
|
"error=0x%04x, pad=0x%04x\n",
|
|
(dwIoControlCode==IFS_IOCTL_21)?"IFS_IOCTL_21":"IFS_IOCTL_2F",
|
|
pIn->ar_proid, pIn->ar_eax, pIn->ar_ebx, pIn->ar_ecx,
|
|
pIn->ar_edx, pIn->ar_esi, pIn->ar_edi, pIn->ar_ebp,
|
|
pIn->ar_error, pIn->ar_pad );
|
|
|
|
win32apieq_2_CONTEXT(pIn,&cxt);
|
|
|
|
if(dwIoControlCode==IFS_IOCTL_21)
|
|
__wine_call_int_handler( &cxt, 0x21 );
|
|
else
|
|
__wine_call_int_handler( &cxt, 0x2f );
|
|
|
|
CONTEXT_2_win32apieq(&cxt,pOut);
|
|
return TRUE;
|
|
}
|
|
case IFS_IOCTL_GET_RES:
|
|
FIXME( "Control 'IFS_IOCTL_GET_RES' not implemented\n");
|
|
return FALSE;
|
|
case IFS_IOCTL_GET_NETPRO_NAME_A:
|
|
FIXME( "Control 'IFS_IOCTL_GET_NETPRO_NAME_A' not implemented\n");
|
|
return FALSE;
|
|
default:
|
|
FIXME( "Control %d not implemented\n", dwIoControlCode);
|
|
return FALSE;
|
|
}
|
|
}
|