[PATCH 1/2] server: Use generic kernel object list to store client device pointer.
Zebediah Figura
z.figura12 at gmail.com
Sat Apr 6 12:22:29 CDT 2019
On 3/27/19 11:43 AM, Jacek Caban wrote:
> diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
> index 77a610d7db..941ce89ab7 100644
> --- a/dlls/ntoskrnl.exe/ntoskrnl.c
> +++ b/dlls/ntoskrnl.exe/ntoskrnl.c
> @@ -1474,8 +1474,6 @@ static const WCHAR device_type_name[] = {'D','e','v','i','c','e',0};
> static struct _OBJECT_TYPE device_type =
> {
> device_type_name,
> - NULL,
> - free_kernel_object
> };
>
> POBJECT_TYPE IoDeviceObjectType = &device_type;
> @@ -1491,7 +1489,6 @@ NTSTATUS WINAPI IoCreateDevice( DRIVER_OBJECT *driver, ULONG ext_size,
> {
> NTSTATUS status;
> DEVICE_OBJECT *device;
> - HANDLE handle = 0;
> HANDLE manager = get_device_manager();
>
> TRACE( "(%p, %u, %s, %u, %x, %u, %p)\n",
> @@ -1500,34 +1497,32 @@ NTSTATUS WINAPI IoCreateDevice( DRIVER_OBJECT *driver, ULONG ext_size,
> if (!(device = alloc_kernel_object( IoDeviceObjectType, NULL, sizeof(DEVICE_OBJECT) + ext_size, 1 )))
> return STATUS_NO_MEMORY;
>
> + device->DriverObject = driver;
> + device->DeviceExtension = device + 1;
> + device->DeviceType = type;
> + device->StackSize = 1;
> +
> + device->NextDevice = driver->DeviceObject;
> + driver->DeviceObject = device;
> +
> SERVER_START_REQ( create_device )
> {
> - req->access = 0;
> - req->attributes = 0;
> req->rootdir = 0;
> req->manager = wine_server_obj_handle( manager );
> req->user_ptr = wine_server_client_ptr( device );
> if (name) wine_server_add_data( req, name->Buffer, name->Length );
> - if (!(status = wine_server_call( req ))) handle = wine_server_ptr_handle( reply->handle );
> + status = wine_server_call( req );
> }
> SERVER_END_REQ;
>
> - if (status == STATUS_SUCCESS)
> + if (status)
> {
> - device->DriverObject = driver;
> - device->DeviceExtension = device + 1;
> - device->DeviceType = type;
> - device->StackSize = 1;
> - device->Reserved = handle;
> -
> - device->NextDevice = driver->DeviceObject;
> - driver->DeviceObject = device;
> -
> - *ret_device = device;
> + free_kernel_object( device );
> + return status;
> }
> - else free_kernel_object( device );
>
> - return status;
> + *ret_device = device;
> + return STATUS_SUCCESS;
> }
What's the reason for moving DEVICE_OBJECT initialization before
create_device call? In particular this won't work correctly if
create_device fails, as then driver->DeviceObject will point to an
invalid device.
More information about the wine-devel
mailing list