[project] Rename winvblock__uint32 back to UINT32
[people/sha0/winvblock.git] / src / include / driver.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_DRIVER_H_
22 #  define WV_M_DRIVER_H_
23
24 /**
25  * @file
26  *
27  * Driver specifics.
28  */
29
30 /* For testing and debugging */
31 #if 0
32 #  define RIS
33 #  define DEBUGIRPS
34 #  define DEBUGMOSTPROTOCOLCALLS
35 #  define DEBUGALLPROTOCOLCALLS
36 #endif
37
38 #define POOLSIZE 2048
39
40 /* An unfortunate forward declaration.  Definition resolved in device.h */
41 struct WV_DEV_T;
42
43 extern PDRIVER_OBJECT WvDriverObj;
44 extern WVL_M_LIB void STDCALL WvDriverCompletePendingIrp(IN PIRP);
45 /* Note the exception to the function naming convention. */
46 extern WVL_M_LIB NTSTATUS STDCALL Error(IN PCHAR, IN NTSTATUS);
47 /* Note the exception to the function naming convention. */
48 extern NTSTATUS STDCALL DriverEntry(
49     IN PDRIVER_OBJECT,
50     IN PUNICODE_STRING
51   );
52
53 /* The physical/function device object's (PDO's/FDO's) DeviceExtension */
54 typedef struct WV_DEV_EXT {
55     struct WV_DEV_T * device;
56   } WV_S_DEV_EXT, * WV_SP_DEV_EXT;
57
58 /* The prototype for a device IRP dispatch. */
59 typedef NTSTATUS STDCALL driver__dispatch_func(
60     IN PDEVICE_OBJECT,
61     IN PIRP
62   );
63 /* PnP IDs for a dummy device. */
64 typedef struct WV_DRIVER_DUMMY_IDS {
65     UINT32 DevOffset;
66     UINT32 DevLen;
67     UINT32 InstanceOffset;
68     UINT32 InstanceLen;
69     UINT32 HardwareOffset;
70     UINT32 HardwareLen;
71     UINT32 CompatOffset;
72     UINT32 CompatLen;
73     UINT32 Len;
74     const WCHAR * Ids;
75     WCHAR Text[1];
76   } WV_S_DRIVER_DUMMY_IDS, * WV_SP_DRIVER_DUMMY_IDS;
77
78 /* Macro support for dummy ID generation. */
79 #define WV_M_DRIVER_DUMMY_IDS_X_ENUM(prefix_, name_, literal_)    \
80   prefix_ ## name_ ## Offset_,                                    \
81   prefix_ ## name_ ## Len_ = sizeof (literal_) / sizeof (WCHAR),  \
82   prefix_ ## name_ ## End_ =                                      \
83     prefix_ ## name_ ## Offset_ + prefix_ ## name_ ## Len_ - 1,
84
85 #define WV_M_DRIVER_DUMMY_IDS_X_LITERALS(prefix_, name_, literal_) \
86   literal_ L"\0"
87
88 #define WV_M_DRIVER_DUMMY_IDS_X_FILL(prefix_, name_, literal_)  \
89   prefix_ ## name_ ## Offset_,                                  \
90   prefix_ ## name_ ## Len_,
91
92 /**
93  * Generate a static const WV_S_DRIVER_DUMMY_IDS object.
94  *
95  * @v DummyIds          The name of the desired object.  Also used as prefix.
96  * @v XMacro            The x-macro with the ID text.
97  *
98  * This macro will produce the following:
99  *   enum values:
100  *     [DummyIds]DevOffset_
101  *     [DummyIds]DevLen_
102  *     [DummyIds]DevEnd_
103  *     [DummyIds]InstanceOffset_
104  *     [DummyIds]InstanceLen_
105  *     [DummyIds]InstanceEnd_
106  *     [DummyIds]HardwareOffset_
107  *     [DummyIds]HardwareLen_
108  *     [DummyIds]HardwareEnd_
109  *     [DummyIds]CompatOffset_
110  *     [DummyIds]CompatLen_
111  *     [DummyIds]CompatEnd_
112  *     [DummyIds]Len_
113  *   WCHAR[]:
114  *     [DummyIds]String_
115  *   static const WV_S_DRIVER_DUMMY_IDS:
116  *     [DummyIds]
117  */
118 #define WV_M_DRIVER_DUMMY_ID_GEN(DummyIds, XMacro)    \
119                                                       \
120 enum {                                                \
121     XMacro(WV_M_DRIVER_DUMMY_IDS_X_ENUM, DummyIds)    \
122     DummyIds ## Len_                                  \
123   };                                                  \
124                                                       \
125 static const WCHAR DummyIds ## String_[] =            \
126   XMacro(WV_M_DRIVER_DUMMY_IDS_X_LITERALS, DummyIds); \
127                                                       \
128 static const WV_S_DRIVER_DUMMY_IDS DummyIds = {       \
129     XMacro(WV_M_DRIVER_DUMMY_IDS_X_FILL, DummyIds)    \
130     DummyIds ## Len_,                                 \
131     DummyIds ## String_                               \
132   }
133
134 extern WVL_M_LIB NTSTATUS STDCALL driver__complete_irp(
135     IN PIRP,
136     IN ULONG_PTR,
137     IN NTSTATUS
138   );
139 extern WVL_M_LIB winvblock__bool STDCALL WvDriverBusAddDev(
140     IN WV_SP_DEV_T
141   );
142 extern NTSTATUS STDCALL WvDriverGetDevCapabilities(
143     IN PDEVICE_OBJECT,
144     IN PDEVICE_CAPABILITIES
145   );
146 extern WVL_M_LIB NTSTATUS STDCALL WvDriverAddDummy(
147     IN const WV_S_DRIVER_DUMMY_IDS *,
148     IN DEVICE_TYPE,
149     IN ULONG
150   );
151 extern WVL_M_LIB NTSTATUS STDCALL WvDriverDummyIds(
152     IN PIRP,
153     IN WV_SP_DRIVER_DUMMY_IDS
154   );
155
156 #endif  /* WV_M_DRIVER_H_ */