} ReleaseSRWLockExclusive(&f->rw_lock); return r; } static const struct file_ops dsp_ops = { .close = dsp_close, .read = dsp_read, .write = dsp_write, .stat = virtualfs_custom_stat, .ioctl = dsp_ioctl, }; static struct file *dsp_alloc(); struct virtualfs_custom_desc dsp_desc = VIRTUALFS_CUSTOM(mkdev(14, 3), dsp_alloc); static struct file *dsp_alloc() { struct dsp_file *f = (struct dsp_file *)kmalloc(sizeof(struct dsp_file)); file_init(&f->custom_file.base_file, &dsp_ops, O_LARGEFILE | O_RDWR); virtualfs_init_custom(f, &dsp_desc); f->waveout = NULL; SECURITY_ATTRIBUTES attr; attr.nLength = sizeof(SECURITY_ATTRIBUTES); attr.bInheritHandle = FALSE; attr.lpSecurityDescriptor = NULL; for (int i = 0; i < DSP_BUFFER_COUNT; i++) f->buffer[i].event = CreateEventW(&attr, FALSE, TRUE, NULL); dsp_reset(f); return (struct file *)f;
} default: log_error("console: unknown ioctl command: %x\n", cmd); r = -EINVAL; break; } console_unlock(); return r; } static const struct file_ops console_ops = { .get_poll_status = console_get_poll_status, .get_poll_handle = console_get_poll_handle, .close = console_close, .read = console_read, .write = console_write, .stat = virtualfs_custom_stat, .ioctl = console_ioctl, }; struct virtualfs_custom_desc console_desc = VIRTUALFS_CUSTOM(mkdev(5, 1), console_alloc); struct file *console_alloc() { struct console_file *f = (struct console_file *)kmalloc(sizeof(struct console_file)); file_init(&f->custom_file.base_file, &console_ops, O_LARGEFILE | O_RDWR); virtualfs_init_custom(f, &console_desc); return (struct file *)f; }