nsiproxy: Introduce IOCTL_NSIPROXY_WINE_GET_ALL_PARAMETERS.

Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Huw Davies 2021-07-01 09:27:03 +01:00 committed by Alexandre Julliard
parent 151370c478
commit 25a582cf32
4 changed files with 88 additions and 0 deletions

View File

@ -82,6 +82,47 @@ static void nsiproxy_enumerate_all( IRP *irp )
else irp->IoStatus.Information = 0; else irp->IoStatus.Information = 0;
} }
static void nsiproxy_get_all_parameters( IRP *irp )
{
IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation( irp );
struct nsiproxy_get_all_parameters *in = (struct nsiproxy_get_all_parameters *)irp->AssociatedIrp.SystemBuffer;
DWORD in_len = irpsp->Parameters.DeviceIoControl.InputBufferLength;
BYTE *out = irp->AssociatedIrp.SystemBuffer;
DWORD out_len = irpsp->Parameters.DeviceIoControl.OutputBufferLength;
struct nsi_get_all_parameters_ex get_all;
if (in_len < FIELD_OFFSET(struct nsiproxy_get_all_parameters, key[0]) ||
in_len < FIELD_OFFSET(struct nsiproxy_get_all_parameters, key[in->key_size]))
{
irp->IoStatus.u.Status = STATUS_INVALID_PARAMETER;
return;
}
if (out_len < in->rw_size + in->dynamic_size + in->static_size)
{
irp->IoStatus.u.Status = STATUS_INVALID_PARAMETER;
return;
}
get_all.unknown[0] = 0;
get_all.unknown[1] = 0;
get_all.first_arg = in->first_arg;
get_all.unknown2 = 0;
get_all.module = &in->module;
get_all.table = in->table;
get_all.key = in->key;
get_all.key_size = in->key_size;
get_all.rw_data = out;
get_all.rw_size = in->rw_size;
get_all.dynamic_data = out + in->rw_size;
get_all.dynamic_size = in->dynamic_size;
get_all.static_data = out + in->rw_size + in->dynamic_size;
get_all.static_size = in->static_size;
irp->IoStatus.u.Status = nsi_get_all_parameters_ex( &get_all );
irp->IoStatus.Information = (irp->IoStatus.u.Status == STATUS_SUCCESS) ? out_len : 0;
}
static NTSTATUS WINAPI nsi_ioctl( DEVICE_OBJECT *device, IRP *irp ) static NTSTATUS WINAPI nsi_ioctl( DEVICE_OBJECT *device, IRP *irp )
{ {
IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation( irp ); IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation( irp );
@ -97,6 +138,10 @@ static NTSTATUS WINAPI nsi_ioctl( DEVICE_OBJECT *device, IRP *irp )
nsiproxy_enumerate_all( irp ); nsiproxy_enumerate_all( irp );
break; break;
case IOCTL_NSIPROXY_WINE_GET_ALL_PARAMETERS:
nsiproxy_get_all_parameters( irp );
break;
default: default:
FIXME( "ioctl %x not supported\n", irpsp->Parameters.DeviceIoControl.IoControlCode ); FIXME( "ioctl %x not supported\n", irpsp->Parameters.DeviceIoControl.IoControlCode );
irp->IoStatus.u.Status = STATUS_NOT_SUPPORTED; irp->IoStatus.u.Status = STATUS_NOT_SUPPORTED;

View File

@ -74,3 +74,28 @@ NTSTATUS nsi_enumerate_all_ex( struct nsi_enumerate_all_ex *params )
return entry->enumerate_all( data[0], sizes[0], data[1], sizes[1], data[2], sizes[2], data[3], sizes[3], &params->count ); return entry->enumerate_all( data[0], sizes[0], data[1], sizes[1], data[2], sizes[2], data[3], sizes[3], &params->count );
} }
NTSTATUS nsi_get_all_parameters_ex( struct nsi_get_all_parameters_ex *params )
{
const struct module_table *entry = get_module_table( params->module, params->table );
void *rw = params->rw_data;
void *dyn = params->dynamic_data;
void *stat = params->static_data;
if (!entry || !entry->get_all_parameters)
{
WARN( "table not found\n" );
return STATUS_INVALID_PARAMETER;
}
if (params->key_size != entry->sizes[0]) return STATUS_INVALID_PARAMETER;
if (!params->rw_size) rw = NULL;
else if (params->rw_size != entry->sizes[1]) return STATUS_INVALID_PARAMETER;
if (!params->dynamic_size) dyn = NULL;
else if (params->dynamic_size != entry->sizes[2]) return STATUS_INVALID_PARAMETER;
if (!params->static_size) stat = NULL;
else if (params->static_size != entry->sizes[3]) return STATUS_INVALID_PARAMETER;
return entry->get_all_parameters( params->key, params->key_size, rw, params->rw_size,
dyn, params->dynamic_size, stat, params->static_size );
}

View File

@ -19,6 +19,7 @@
*/ */
NTSTATUS nsi_enumerate_all_ex( struct nsi_enumerate_all_ex *params ) DECLSPEC_HIDDEN; NTSTATUS nsi_enumerate_all_ex( struct nsi_enumerate_all_ex *params ) DECLSPEC_HIDDEN;
NTSTATUS nsi_get_all_parameters_ex( struct nsi_get_all_parameters_ex *params ) DECLSPEC_HIDDEN;
struct module_table struct module_table
{ {
@ -27,6 +28,9 @@ struct module_table
NTSTATUS (*enumerate_all)( void *key_data, DWORD key_size, void *rw_data, DWORD rw_size, NTSTATUS (*enumerate_all)( void *key_data, DWORD key_size, void *rw_data, DWORD rw_size,
void *dynamic_data, DWORD dynamic_size, void *dynamic_data, DWORD dynamic_size,
void *static_data, DWORD static_size, DWORD_PTR *count ); void *static_data, DWORD static_size, DWORD_PTR *count );
NTSTATUS (*get_all_parameters)( const void *key, DWORD key_size, void *rw_data, DWORD rw_size,
void *dynamic_data, DWORD dynamic_size,
void *static_data, DWORD static_size );
}; };
struct module struct module

View File

@ -97,6 +97,7 @@ struct nsi_ndis_ifinfo_static
/* Wine specific ioctl interface */ /* Wine specific ioctl interface */
#define IOCTL_NSIPROXY_WINE_ENUMERATE_ALL CTL_CODE(FILE_DEVICE_NETWORK, 0x400, METHOD_BUFFERED, 0) #define IOCTL_NSIPROXY_WINE_ENUMERATE_ALL CTL_CODE(FILE_DEVICE_NETWORK, 0x400, METHOD_BUFFERED, 0)
#define IOCTL_NSIPROXY_WINE_GET_ALL_PARAMETERS CTL_CODE(FILE_DEVICE_NETWORK, 0x401, METHOD_BUFFERED, 0)
/* input for IOCTL_NSIPROXY_WINE_ENUMERATE_ALL */ /* input for IOCTL_NSIPROXY_WINE_ENUMERATE_ALL */
struct nsiproxy_enumerate_all struct nsiproxy_enumerate_all
@ -112,6 +113,19 @@ struct nsiproxy_enumerate_all
DWORD count; DWORD count;
}; };
/* input for IOCTL_NSIPROXY_WINE_GET_ALL_PARAMETERS */
struct nsiproxy_get_all_parameters
{
NPI_MODULEID module;
DWORD first_arg;
DWORD table;
DWORD key_size;
DWORD rw_size;
DWORD dynamic_size;
DWORD static_size;
BYTE key[1]; /* key_size */
};
/* Undocumented Nsi api */ /* Undocumented Nsi api */
#define NSI_PARAM_TYPE_RW 0 #define NSI_PARAM_TYPE_RW 0