[device] Add device__init for initializing to defaults
[people/sha0/winvblock.git] / src / include / device.h
1 /**
2  * Copyright (C) 2009-2010, Shao Miller <shao.miller@yrdsb.edu.on.ca>.
3  * Copyright 2006-2008, V.
4  * For WinAoE contact information, see http://winaoe.org/
5  *
6  * This file is part of WinVBlock, derived from WinAoE.
7  *
8  * WinVBlock is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * WinVBlock is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with WinVBlock.  If not, see <http://www.gnu.org/licenses/>.
20  */
21 #ifndef _DEVICE_H
22 #  define _DEVICE_H
23
24 /**
25  * @file
26  *
27  * Device specifics.
28  */
29
30 enum device__state {
31     device__state_not_started,
32     device__state_started,
33     device__state_stop_pending,
34     device__state_stopped,
35     device__state_remove_pending,
36     device__state_surprise_remove_pending,
37     device__state_deleted
38   };
39
40 /* Forward declaration. */
41 struct device__type;
42
43 /**
44  * Device PDO creation routine.
45  *
46  * @v dev               The device whose PDO should be created.
47  * @ret pdo             Points to the new PDO, or is NULL upon failure.
48  */
49 typedef PDEVICE_OBJECT STDCALL device__create_pdo_func(
50     IN struct device__type *
51   );
52
53 extern winvblock__lib_func device__create_pdo_func device__create_pdo;
54
55 /**
56  * Device initialization routine.
57  *
58  * @v dev               The device being initialized.
59  */
60 typedef winvblock__bool STDCALL device__init_func(IN struct device__type *);
61
62 /**
63  * Device PnP ID reponse routine.
64  *
65  * @v dev                       The device being queried for PnP IDs.
66  * @v query_type                The query type.
67  * @v buf                       Wide character, 512-element buffer for the
68  *                              ID response.
69  * @ret winvblock__uint32       The number of wide characters in the response.
70  */
71 typedef winvblock__uint32 STDCALL device__pnp_id_func(
72     IN struct device__type *,
73     IN BUS_QUERY_ID_TYPE,
74     IN OUT WCHAR (*)[512]
75   );
76
77 extern winvblock__lib_func device__pnp_id_func device__pnp_id;
78
79 /**
80  * Device close routine.
81  *
82  * @v dev               The device being closed.
83  */
84 typedef void STDCALL device__close_func(IN struct device__type *);
85
86 extern winvblock__lib_func device__close_func device__close;
87
88 /**
89  * Device deletion routine.
90  *
91  * @v dev_ptr           Points to the device to delete.
92  */
93 typedef void STDCALL device__free_func(IN struct device__type *);
94
95 extern winvblock__lib_func device__free_func device__free;
96
97 extern winvblock__lib_func void device__init(struct device__type *);
98 extern winvblock__lib_func struct device__type * device__create(void);
99
100 winvblock__def_struct(device__ops) {
101     device__create_pdo_func * create_pdo;
102     device__init_func * init;
103     device__pnp_id_func * pnp_id;
104     device__close_func * close;
105     device__free_func * free;
106   };
107
108 typedef void STDCALL device__thread_func(IN void *);
109
110 /**
111  * The prototype for a device IRP dispatch.
112  *
113  * @v dev               Points to the device.
114  * @v irp               Points to the IRP.
115  * @ret NTSTATUS        The status of processing the IRP for the device.
116  */
117 typedef NTSTATUS STDCALL device__dispatch_func(
118     IN struct device__type *,
119     IN PIRP
120   );
121
122 /**
123  * The prototype for a device IRP_MJ_DEVICE_CONTROL dispatch.
124  *
125  * @v dev               Points to the device.
126  * @v irp               Points to the IRP.
127  * @v code              The I/O control code.
128  * @ret NTSTATUS        The status of processing the IRP for the device.
129  */
130 typedef NTSTATUS STDCALL device__dev_ctl_func(
131     IN struct device__type *,
132     IN PIRP,
133     IN ULONG POINTER_ALIGNMENT
134   );
135
136 /**
137  * The prototype for a device IRP_MJ_SCSI dispatch.
138  *
139  * @v dev               Points to the device.
140  * @v irp               Points to the IRP.
141  * @v code              The SCSI function.
142  * @ret NTSTATUS        The status of processing the IRP for the device.
143  */
144 typedef NTSTATUS STDCALL device__scsi_func(
145     IN struct device__type *,
146     IN PIRP,
147     IN UCHAR
148   );
149
150 /**
151  * The prototype for a device IRP_MJ_PNP dispatch.
152  *
153  * @v dev               Points to the device.
154  * @v irp               Points to the IRP.
155  * @v code              The minor function.
156  * @ret NTSTATUS        The status of processing the IRP for the device.
157  */
158 typedef NTSTATUS STDCALL device__pnp_func(
159     IN struct device__type *,
160     IN PIRP,
161     IN UCHAR
162   );
163
164 /* IRP major function handler table. */
165 struct device__irp_mj {
166     device__dispatch_func * power;
167     device__dispatch_func * sys_ctl;
168     device__dev_ctl_func * dev_ctl;
169     device__scsi_func * scsi;
170     device__pnp_func * pnp;
171   };
172
173 /* Details common to all devices this driver works with */
174 struct device__type {
175     /* For debugging */
176     winvblock__bool IsBus;
177     /* A device's IRP dispatch routine. */
178     driver__dispatch_func * dispatch;
179     /* The device's thread routine. */
180     device__thread_func * thread;
181     /* The device's thread wakeup signal. */
182     KEVENT thread_wakeup;
183     /* The device's IRP queue. */
184     LIST_ENTRY irp_list;
185     /* The device's IRP queue lock. */
186     KSPIN_LOCK irp_list_lock;
187     /* Self is self-explanatory. */
188     PDEVICE_OBJECT Self;
189     /* Flag to create/delete a PDO on a threaded bus. */
190     winvblock__bool thread_pdo;
191     /* Points to the parent bus' DEVICE_OBJECT */
192     PDEVICE_OBJECT Parent;
193     /* The device's child ID relative to the parent bus. */
194     winvblock__uint32 dev_num;
195     /* Points to the driver. */
196     PDRIVER_OBJECT DriverObject;
197     /* Current state of the device. */
198     enum device__state state;
199     /* Previous state of the device. */
200     enum device__state old_state;
201     /* The next device in the parent bus' devices.  TODO: Don't do this. */
202     struct device__type * next_sibling_ptr;
203     /* The device operations. */
204     device__ops ops;
205     /* Tracking for the device module itself. */
206     LIST_ENTRY tracking;
207     /* Points to further extensions. */
208     winvblock__any_ptr ext;
209     /* How to handle IRPs based on major function code. */
210     struct device__irp_mj * irp_mj;
211   };
212
213 extern winvblock__lib_func struct device__type * device__get(PDEVICE_OBJECT);
214 extern winvblock__lib_func void device__set(
215     PDEVICE_OBJECT,
216     struct device__type *
217   );
218 extern device__dispatch_func device__pnp_query_id;
219
220 #endif  /* _DEVICE_H */