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