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