[project] Rename winvblock__uint32 back to UINT32
[people/sha0/winvblock.git] / src / include / device.h
1 /**
2  * Copyright (C) 2009-2011, 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 WV_M_DEVICE_H_
22 #  define WV_M_DEVICE_H_
23
24 /**
25  * @file
26  *
27  * Device specifics.
28  */
29
30 typedef enum WV_DEV_STATE {
31     WvDevStateNotStarted,
32     WvDevStateStarted,
33     WvDevStateStopPending,
34     WvDevStateStopped,
35     WvDevStateRemovePending,
36     WvDevStateSurpriseRemovePending,
37     WvDevStateDeleted,
38     WvDevStates
39   } WV_E_DEV_STATE, * WV_EP_DEV_STATE;
40
41 /* Forward declarations. */
42 typedef struct WV_DEV_T WV_S_DEV_T, * WV_SP_DEV_T;
43
44 /**
45  * Device PDO creation routine.
46  *
47  * @v dev               The device whose PDO should be created.
48  * @ret pdo             Points to the new PDO, or is NULL upon failure.
49  */
50 typedef PDEVICE_OBJECT STDCALL WV_F_DEV_CREATE_PDO(IN WV_SP_DEV_T);
51 typedef WV_F_DEV_CREATE_PDO * WV_FP_DEV_CREATE_PDO;
52 extern WVL_M_LIB WV_F_DEV_CREATE_PDO WvDevCreatePdo;
53
54 /**
55  * Device initialization routine.
56  *
57  * @v dev               The device being initialized.
58  */
59 typedef winvblock__bool STDCALL WV_F_DEV_INIT(IN WV_SP_DEV_T);
60 typedef WV_F_DEV_INIT * WV_FP_DEV_INIT;
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 UINT32       The number of wide characters in the response.
70  */
71 typedef UINT32 STDCALL WV_F_DEV_PNP_ID(
72     IN WV_SP_DEV_T,
73     IN BUS_QUERY_ID_TYPE,
74     IN OUT WCHAR (*)[512]
75   );
76 typedef WV_F_DEV_PNP_ID * WV_FP_DEV_PNP_ID;
77 extern WVL_M_LIB WV_F_DEV_PNP_ID WvDevPnpId;
78
79 /**
80  * Device close routine.
81  *
82  * @v dev               The device being closed.
83  */
84 typedef void STDCALL WV_F_DEV_CLOSE(IN WV_SP_DEV_T);
85 typedef WV_F_DEV_CLOSE * WV_FP_DEV_CLOSE;
86 extern WVL_M_LIB WV_F_DEV_CLOSE WvDevClose;
87
88 /**
89  * Device deletion routine.
90  *
91  * @v dev_ptr           Points to the device to delete.
92  */
93 typedef void STDCALL WV_F_DEV_FREE(IN WV_SP_DEV_T);
94 typedef WV_F_DEV_FREE * WV_FP_DEV_FREE;
95 extern WVL_M_LIB WV_F_DEV_FREE WvDevFree;
96
97 extern WVL_M_LIB void WvDevInit(WV_SP_DEV_T);
98 extern WVL_M_LIB WV_SP_DEV_T WvDevCreate(void);
99
100 typedef struct WV_DEV_OPS {
101     WV_FP_DEV_CREATE_PDO CreatePdo;
102     WV_FP_DEV_INIT Init;
103     WV_FP_DEV_PNP_ID PnpId;
104     WV_FP_DEV_CLOSE Close;
105     WV_FP_DEV_FREE Free;
106   } WV_S_DEV_OPS, * WV_SP_DEV_OPS;
107
108 /**
109  * The prototype for a device IRP dispatch.
110  *
111  * @v dev               Points to the device.
112  * @v irp               Points to the IRP.
113  * @ret NTSTATUS        The status of processing the IRP for the device.
114  */
115 typedef NTSTATUS STDCALL WV_F_DEV_DISPATCH(IN WV_SP_DEV_T, IN PIRP);
116 typedef WV_F_DEV_DISPATCH * WV_FP_DEV_DISPATCH;
117
118 /**
119  * The prototype for a device IRP_MJ_DEVICE_CONTROL dispatch.
120  *
121  * @v dev               Points to the device.
122  * @v irp               Points to the IRP.
123  * @v code              The I/O control code.
124  * @ret NTSTATUS        The status of processing the IRP for the device.
125  */
126 typedef NTSTATUS STDCALL WV_F_DEV_CTL(
127     IN WV_SP_DEV_T,
128     IN PIRP,
129     IN ULONG POINTER_ALIGNMENT
130   );
131 typedef WV_F_DEV_CTL * WV_FP_DEV_CTL;
132
133 /**
134  * The prototype for a device IRP_MJ_SCSI dispatch.
135  *
136  * @v dev               Points to the device.
137  * @v irp               Points to the IRP.
138  * @v code              The SCSI function.
139  * @ret NTSTATUS        The status of processing the IRP for the device.
140  */
141 typedef NTSTATUS STDCALL WV_F_DEV_SCSI(IN WV_SP_DEV_T, IN PIRP, IN UCHAR);
142 typedef WV_F_DEV_SCSI * WV_FP_DEV_SCSI;
143
144 /**
145  * The prototype for a device IRP_MJ_PNP dispatch.
146  *
147  * @v dev               Points to the device.
148  * @v irp               Points to the IRP.
149  * @v code              The minor function.
150  * @ret NTSTATUS        The status of processing the IRP for the device.
151  */
152 typedef NTSTATUS STDCALL WV_F_DEV_PNP(IN WV_SP_DEV_T, IN PIRP, IN UCHAR);
153 typedef WV_F_DEV_PNP * WV_FP_DEV_PNP;
154
155 /* IRP major function handler table. */
156 typedef struct WV_DEV_IRP_MJ {
157     WV_FP_DEV_DISPATCH Power;
158     WV_FP_DEV_DISPATCH SysCtl;
159     WV_FP_DEV_CTL DevCtl;
160     WV_FP_DEV_SCSI Scsi;
161     WV_FP_DEV_PNP Pnp;
162   } WV_S_DEV_IRP_MJ, * WV_SP_DEV_IRP_MJ;
163
164 /* Details common to all devices this driver works with */
165 struct WV_DEV_T {
166     /* For debugging */
167     winvblock__bool IsBus;
168     /* Self is self-explanatory. */
169     PDEVICE_OBJECT Self;
170     /* Points to the parent bus' DEVICE_OBJECT */
171     PDEVICE_OBJECT Parent;
172     /* The device's child ID relative to the parent bus. */
173     UINT32 DevNum;
174     /* Points to the driver. */
175     PDRIVER_OBJECT DriverObject;
176     /* Current state of the device. */
177     WV_E_DEV_STATE State;
178     /* Previous state of the device. */
179     WV_E_DEV_STATE OldState;
180     /* Support being a node on a bus. */
181     WVL_S_BUS_NODE BusNode;
182     /* The device operations. */
183     WV_S_DEV_OPS Ops;
184     /* Points to further extensions. */
185     winvblock__any_ptr ext;
186     /* How to handle IRPs based on major function code. */
187     WV_SP_DEV_IRP_MJ IrpMj;
188     /* Was the device established at boot time? */
189     winvblock__bool Boot;
190   };
191
192 extern WVL_M_LIB WV_SP_DEV_T WvDevFromDevObj(PDEVICE_OBJECT);
193 extern WVL_M_LIB void WvDevForDevObj(PDEVICE_OBJECT, WV_SP_DEV_T);
194 extern WV_F_DEV_DISPATCH WvDevPnpQueryId;
195
196 #endif  /* WV_M_DEVICE_H_ */