VirtualBox

source: vbox/trunk/src/VBox/HostDrivers/Support/SUPDrvIDC.h@ 66287

Last change on this file since 66287 was 62490, checked in by vboxsync, 8 years ago

(C) 2016

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.6 KB
Line 
1/* $Id: SUPDrvIDC.h 62490 2016-07-22 18:41:49Z vboxsync $ */
2/** @file
3 * VirtualBox Support Driver - Inter-Driver Communication (IDC) definitions.
4 */
5
6/*
7 * Copyright (C) 2008-2016 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27#ifndef ___SUPDrvIDC_h___
28#define ___SUPDrvIDC_h___
29
30#include <VBox/types.h>
31
32/** @def SUP_IDC_CODE
33 * Creates IDC function code.
34 *
35 * @param Function The function number to encode, 1..255.
36 *
37 * @remarks We can take a slightly more relaxed attitude wrt to size encoding
38 * here since only windows will use standard I/O control function code.
39 */
40#ifdef RT_OS_WINDOWS
41# define SUP_IDC_CODE(Function) CTL_CODE(FILE_DEVICE_UNKNOWN, (Function) + 2542, METHOD_BUFFERED, FILE_WRITE_ACCESS)
42#else
43# define SUP_IDC_CODE(Function) ( UINT32_C(0xc0ffee00) | (uint32_t)(0x000000ff & (Function)) )
44#endif
45
46
47/*******************************************************************************
48* Structures and Typedefs *
49*******************************************************************************/
50#ifdef RT_ARCH_AMD64
51# pragma pack(8) /* paranoia. */
52#else
53# pragma pack(4) /* paranoia. */
54#endif
55
56
57/**
58 * An IDC request packet header.
59 *
60 * The main purpose of this header is to pass the session handle
61 * and status code in a generic manner in order to make things
62 * easier on the receiving end.
63 */
64typedef struct SUPDRVIDCREQHDR
65{
66 /** IN: The size of the request. */
67 uint32_t cb;
68 /** OUT: Status code of the request. */
69 int32_t rc;
70 /** IN: Pointer to the session handle. */
71 PSUPDRVSESSION pSession;
72#if ARCH_BITS == 32
73 /** Padding the structure to 16-bytes. */
74 uint32_t u32Padding;
75#endif
76} SUPDRVIDCREQHDR;
77/** Pointer to an IDC request packet header. */
78typedef SUPDRVIDCREQHDR *PSUPDRVIDCREQHDR;
79/** Pointer to a const IDC request packet header. */
80typedef SUPDRVIDCREQHDR const *PCSUPDRVIDCREQHDR;
81
82
83/**
84 * SUPDRV IDC: Connect request.
85 * This request takes a SUPDRVIDCREQCONNECT packet.
86 */
87#define SUPDRV_IDC_REQ_CONNECT SUP_IDC_CODE(1)
88/** A SUPDRV IDC connect request packet. */
89typedef struct SUPDRVIDCREQCONNECT
90{
91 /** The request header. */
92 SUPDRVIDCREQHDR Hdr;
93 /** The payload union. */
94 union
95 {
96 /** The input. */
97 struct SUPDRVIDCREQCONNECTIN
98 {
99 /** The magic cookie (SUPDRVIDCREQ_CONNECT_MAGIC_COOKIE). */
100 uint32_t u32MagicCookie;
101 /** The desired version of the IDC interface. */
102 uint32_t uReqVersion;
103 /** The minimum version of the IDC interface. */
104 uint32_t uMinVersion;
105 } In;
106
107 /** The output. */
108 struct SUPDRVIDCREQCONNECTOUT
109 {
110 /** The support driver session. (An opaque.) */
111 PSUPDRVSESSION pSession;
112 /** The version of the IDC interface for this session. */
113 uint32_t uSessionVersion;
114 /** The version of the IDC interface . */
115 uint32_t uDriverVersion;
116 /** The SVN revision of the driver.
117 * This will be set to 0 if not compiled into the driver. */
118 uint32_t uDriverRevision;
119 } Out;
120 } u;
121} SUPDRVIDCREQCONNECT;
122/** Pointer to a SUPDRV IDC connect request. */
123typedef SUPDRVIDCREQCONNECT *PSUPDRVIDCREQCONNECT;
124/** Magic cookie value (SUPDRVIDCREQCONNECT::In.u32MagicCookie). ('tori') */
125#define SUPDRVIDCREQ_CONNECT_MAGIC_COOKIE UINT32_C(0x69726f74)
126
127
128/**
129 * SUPDRV IDC: Disconnect request.
130 * This request only requires a SUPDRVIDCREQHDR.
131 */
132#define SUPDRV_IDC_REQ_DISCONNECT SUP_IDC_CODE(2)
133
134
135/**
136 * SUPDRV IDC: Query a symbol address.
137 * This request takes a SUPDRVIDCREQGETSYM packet.
138 */
139#define SUPDRV_IDC_REQ_GET_SYMBOL SUP_IDC_CODE(3)
140/** A SUPDRV IDC get symbol request packet. */
141typedef struct SUPDRVIDCREQGETSYM
142{
143 /** The request header. */
144 SUPDRVIDCREQHDR Hdr;
145 /** The payload union. */
146 union
147 {
148 /** The input. */
149 struct SUPDRVIDCREQGETSYMIN
150 {
151 /** The module name.
152 * NULL is an alias for the support driver. */
153 const char *pszModule;
154 /** The symbol name. */
155 const char *pszSymbol;
156 } In;
157
158 /** The output. */
159 struct SUPDRVIDCREQGETSYMOUT
160 {
161 /** The symbol address. */
162 PFNRT pfnSymbol;
163 } Out;
164 } u;
165} SUPDRVIDCREQGETSYM;
166/** Pointer to a SUPDRV IDC get symbol request. */
167typedef SUPDRVIDCREQGETSYM *PSUPDRVIDCREQGETSYM;
168
169
170/**
171 * SUPDRV IDC: Request the registration of a component factory.
172 * This request takes a SUPDRVIDCREQCOMPREGFACTORY packet.
173 */
174#define SUPDRV_IDC_REQ_COMPONENT_REGISTER_FACTORY SUP_IDC_CODE(10)
175/** A SUPDRV IDC register component factory request packet. */
176typedef struct SUPDRVIDCREQCOMPREGFACTORY
177{
178 /** The request header. */
179 SUPDRVIDCREQHDR Hdr;
180 /** The payload union. */
181 union
182 {
183 /** The input. */
184 struct SUPDRVIDCREQCOMPREGFACTORYIN
185 {
186 /** Pointer to the factory. */
187 PCSUPDRVFACTORY pFactory;
188 } In;
189 } u;
190} SUPDRVIDCREQCOMPREGFACTORY;
191/** Pointer to a SUPDRV IDC register component factory request. */
192typedef SUPDRVIDCREQCOMPREGFACTORY *PSUPDRVIDCREQCOMPREGFACTORY;
193
194
195/**
196 * SUPDRV IDC: Deregister a component factory.
197 * This request takes a SUPDRVIDCREQCOMPDEREGFACTORY packet.
198 */
199#define SUPDRV_IDC_REQ_COMPONENT_DEREGISTER_FACTORY SUP_IDC_CODE(11)
200/** A SUPDRV IDC deregister component factory request packet. */
201typedef struct SUPDRVIDCREQCOMPDEREGFACTORY
202{
203 /** The request header. */
204 SUPDRVIDCREQHDR Hdr;
205 /** The payload union. */
206 union
207 {
208 /** The input. */
209 struct SUPDRVIDCREQCOMPDEREGFACTORYIN
210 {
211 /** Pointer to the factory. */
212 PCSUPDRVFACTORY pFactory;
213 } In;
214 } u;
215} SUPDRVIDCREQCOMPDEREGFACTORY;
216/** Pointer to a SUPDRV IDC deregister component factory request. */
217typedef SUPDRVIDCREQCOMPDEREGFACTORY *PSUPDRVIDCREQCOMPDEREGFACTORY;
218
219
220/*
221 * The OS specific prototypes.
222 * Most OSes uses
223 */
224RT_C_DECLS_BEGIN
225
226#if defined(RT_OS_DARWIN)
227# ifdef IN_SUP_R0
228extern DECLEXPORT(int) VBOXCALL SUPDrvDarwinIDC(uint32_t iReq, PSUPDRVIDCREQHDR pReq);
229# else
230extern DECLIMPORT(int) VBOXCALL SUPDrvDarwinIDC(uint32_t iReq, PSUPDRVIDCREQHDR pReq);
231# endif
232
233#elif defined(RT_OS_FREEBSD)
234extern int VBOXCALL SUPDrvFreeBSDIDC(uint32_t iReq, PSUPDRVIDCREQHDR pReq);
235
236#elif defined(RT_OS_LINUX)
237extern int VBOXCALL SUPDrvLinuxIDC(uint32_t iReq, PSUPDRVIDCREQHDR pReq);
238
239#elif defined(RT_OS_OS2)
240/** @todo Port to OS/2. */
241
242#elif defined(RT_OS_SOLARIS)
243extern int VBOXCALL SUPDrvSolarisIDC(uint32_t iReq, PSUPDRVIDCREQHDR pReq);
244
245#elif defined(RT_OS_WINDOWS)
246/* Nothing special for windows. */
247
248#else
249/* PORTME: OS specific IDC stuff goes here. */
250#endif
251
252RT_C_DECLS_END
253
254/**
255 * The SUPDRV IDC entry point.
256 *
257 * @returns VBox status code indicating the validity of the session, request and
258 * the return data packet. The status of the request it self is found
259 * in the packet (specific to each request).
260 *
261 * @param pSession The session. (This is NULL for SUPDRV_IDC_REQ_CONNECT.)
262 * @param uReq The request number.
263 * @param pvReq Pointer to the request packet. Optional for some requests.
264 * @param cbReq The size of the request packet.
265 */
266/** @todo move this and change to function proto */
267typedef DECLCALLBACK(int) FNSUPDRVIDCENTRY(PSUPDRVSESSION pSession, uint32_t uReq, void *pvReq, uint32_t cbReq);
268
269/** @} */
270
271
272#pragma pack() /* paranoia */
273
274#endif
275
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette