static struct object *device_open_file( struct object *obj, unsigned int access, unsigned int sharing, unsigned int options ) { struct device *device = (struct device *)obj; struct device_file *file; if (!(file = alloc_object( &device_file_ops ))) return NULL; file->device = (struct device *)grab_object( device ); file->user_ptr = 0; list_init( &file->requests ); list_add_tail( &device->files, &file->entry ); if (device->unix_path) { mode_t mode = 0666; access = file->obj.ops->map_access( &file->obj, access ); file->fd = open_fd( NULL, device->unix_path, O_NONBLOCK | O_LARGEFILE, &mode, access, sharing, options ); if (file->fd) set_fd_user( file->fd, &device_file_fd_ops, &file->obj ); } else file->fd = alloc_pseudo_fd( &device_file_fd_ops, &file->obj, 0 ); if (!file->fd) { release_object( file ); return NULL; } if (device->manager) { struct irp_call *irp; irp_params_t params; memset( ¶ms, 0, sizeof(params) ); params.create.major = IRP_MJ_CREATE; params.create.access = access; params.create.sharing = sharing; params.create.options = options; params.create.device = file->device->user_ptr; if ((irp = create_irp( file, ¶ms, NULL, 0, 0 ))) { add_irp_to_queue( file, irp, NULL ); release_object( irp ); } } return &file->obj; }
static struct device *create_device(HANDLE root, const struct unicode_str *name, struct device_manager *manager, unsigned int attr) { struct device *device; if ((device = create_named_object_dir(root, name, attr, &device_ops))) { if (get_error() != STATUS_OBJECT_NAME_EXISTS) { /* initialize it if it didn't already exist */ device->manager = manager; list_add_before(&manager->devices, &device->entry); INIT_LIST_HEAD(&device->requests); if (!(device->fd = alloc_pseudo_fd(&device_fd_ops, &device->obj, 0))) { release_object(device); device = NULL; } } } return device; }