[device] Don't use winvblock__def_struct for device__type
[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 close routine
64  *
65  * @v dev_ptr           The device being closed
66  */
67 #  define device__close_decl( x ) \
68 \
69 void STDCALL \
70 x ( \
71   IN struct device__type * dev_ptr \
72  )
73 /*
74  * Function pointer for a device close routine.
75  * 'indent' mangles this, so it looks weird
76  */
77 typedef device__close_decl (
78    ( *device__close_routine )
79  );
80 /**
81  * Close a device
82  *
83  * @v dev_ptr           Points to the device to close
84  */
85 extern winvblock__lib_func device__close_decl (
86   device__close
87  );
88
89 /**
90  * Device deletion routine.
91  *
92  * @v dev_ptr           Points to the device to delete.
93  */
94 typedef void STDCALL device__free_func(IN struct device__type *);
95 /**
96  * Delete a device.
97  *
98  * @v dev_ptr           Points to the device to delete.
99  */
100 extern winvblock__lib_func device__free_func device__free;
101
102 /**
103  * Initialize the global, device-common environment
104  *
105  * @ret ntstatus        STATUS_SUCCESS or the NTSTATUS for a failure
106  */
107 extern STDCALL NTSTATUS device__init (
108   void
109  );
110
111 /**
112  * Create a new device
113  *
114  * @ret dev_ptr         The address of a new device, or NULL for failure
115  *
116  * This function should not be confused with a PDO creation routine, which is
117  * actually implemented for each device type.  This routine will allocate a
118  * device__type, track it in a global list, as well as populate the device
119  * with default values.
120  */
121 extern winvblock__lib_func struct device__type * device__create (
122   void
123  );
124
125 winvblock__def_struct(device__ops) {
126     device__create_pdo_func * create_pdo;
127     device__init_func * init;
128     device__close_routine close;
129     device__free_func * free;
130   };
131
132 typedef void STDCALL (device__thread_func)(IN void *);
133
134 /* Details common to all devices this driver works with */
135 struct device__type
136 {
137   winvblock__bool IsBus;        /* For debugging */
138   /* A device's IRP dispatch routine. */
139   driver__dispatch_func * (dispatch);
140   /* The device's thread routine. */
141   device__thread_func * (thread);
142   /* The device's thread wakeup signal. */
143   KEVENT (thread_wakeup);
144   /* The device's IRP queue. */
145   LIST_ENTRY (irp_list);
146   /* The device's IRP queue lock. */
147   KSPIN_LOCK (irp_list_lock);
148   PDEVICE_OBJECT Self;
149   PDEVICE_OBJECT Parent;
150   PDRIVER_OBJECT DriverObject;
151   enum device__state state;
152   enum device__state old_state;
153   irp__handler_chain irp_handler_chain;
154   struct device__type * next_sibling_ptr;
155   device__ops ops;
156   LIST_ENTRY tracking;
157   winvblock__any_ptr ext;
158 };
159
160 extern winvblock__lib_func struct device__type * device__get(PDEVICE_OBJECT);
161 extern winvblock__lib_func void device__set(
162     PDEVICE_OBJECT,
163     struct device__type *
164   );
165
166 #endif  /* _DEVICE_H */