SUPDrvIOC.h revision e88405e4cc178723ea46e36ec7836a89cfb2e230
/* $Revision$ */
/** @file
* VirtualBox Support Driver - IOCtl definitions.
*/
/*
* Copyright (C) 2006-2007 Sun Microsystems, Inc.
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*
* The contents of this file may alternatively be used under the terms
* of the Common Development and Distribution License Version 1.0
* (CDDL) only, as it comes in the "COPYING.CDDL" file of the
* VirtualBox OSE distribution, in which case the provisions of the
* CDDL are applicable instead of those of the GPL.
*
* You may elect to license modified versions of this file under the
* terms and conditions of either the GPL or the CDDL or both.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 USA or visit http://www.sun.com if you need
* additional information or have any questions.
*/
#ifndef ___SUPDrvIOC_h___
#define ___SUPDrvIOC_h___
/*
* Basic types.
*/
/*
* IOCtl numbers.
* We're using the Win32 type of numbers here, thus the macros below.
* The SUP_IOCTL_FLAG macro is used to separate requests from 32-bit
* and 64-bit processes.
*/
#ifdef RT_ARCH_AMD64
# define SUP_IOCTL_FLAG 128
#elif defined(RT_ARCH_X86)
# define SUP_IOCTL_FLAG 0
#else
# error "dunno which arch this is!"
#endif
#ifdef RT_OS_WINDOWS
# ifndef CTL_CODE
# include <Windows.h>
# endif
/* Automatic buffering, size not encoded. */
# define SUP_CTL_CODE_SIZE(Function, Size) CTL_CODE(FILE_DEVICE_UNKNOWN, (Function) | SUP_IOCTL_FLAG, METHOD_BUFFERED, FILE_WRITE_ACCESS)
# define SUP_CTL_CODE_BIG(Function) CTL_CODE(FILE_DEVICE_UNKNOWN, (Function) | SUP_IOCTL_FLAG, METHOD_BUFFERED, FILE_WRITE_ACCESS)
# define SUP_CTL_CODE_FAST(Function) CTL_CODE(FILE_DEVICE_UNKNOWN, (Function) | SUP_IOCTL_FLAG, METHOD_NEITHER, FILE_WRITE_ACCESS)
#elif defined(RT_OS_SOLARIS)
/* No automatic buffering, size limited to 255 bytes. */
# define SUP_CTL_CODE_SIZE(Function, Size) _IOWRN('V', (Function) | SUP_IOCTL_FLAG, sizeof(SUPREQHDR))
/* No automatic buffering, size not encoded. */
# define SUP_CTL_CATEGORY 0xc0
# define SUP_CTL_CATEGORY_FAST 0xc1
#elif defined(RT_OS_LINUX)
/* No automatic buffering, size limited to 16KB. */
# define SUP_CTL_CODE_SIZE(Function, Size) _IOC(_IOC_READ | _IOC_WRITE, 'V', (Function) | SUP_IOCTL_FLAG, (Size))
/* Implemented in suplib, no worries. */
#else /* BSD Like */
/* Automatic buffering, size limited to 4KB on *BSD and 8KB on Darwin - commands the limit, 4KB. */
# define SUP_CTL_CODE_SIZE(Function, Size) _IOC(IOC_INOUT, 'V', (Function) | SUP_IOCTL_FLAG, (Size))
#endif
/** Fast path IOCtl: VMMR0_DO_RAW_RUN */
/** Fast path IOCtl: VMMR0_DO_HWACC_RUN */
/** Just a NOP call for profiling the latency of a fast ioctl call to VMMR0. */
/*******************************************************************************
* Structures and Typedefs *
*******************************************************************************/
#ifdef RT_ARCH_AMD64
#else
#endif
/**
*/
typedef struct SUPREQHDR
{
/** Cookie. */
/** Session cookie. */
/** The size of the input. */
/** The size of the output. */
/** Flags. See SUPREQHDR_FLAGS_* for details and values. */
/** The VBox status code of the operation, out direction only. */
} SUPREQHDR;
/** Pointer to a IOC header. */
typedef SUPREQHDR *PSUPREQHDR;
/** @name SUPREQHDR::fFlags values
* @{ */
/** Masks out the magic value. */
/** The generic mask. */
/** The request specific mask. */
/** There is extra input that needs copying on some platforms. */
/** There is extra output that needs copying on some platforms. */
/** The magic value. */
/** The default value. Use this when no special stuff is requested. */
/** @} */
/** @name SUP_IOCTL_COOKIE
* @{
*/
/** Negotiate cookie. */
/** The request size. */
#define SUP_IOCTL_COOKIE_SIZE sizeof(SUPCOOKIE)
/** The SUPREQHDR::cbIn value. */
/** The SUPREQHDR::cbOut value. */
/** SUPCOOKIE_IN magic word. */
#define SUPCOOKIE_MAGIC "The Magic Word!"
/** The initial cookie. */
/** Current interface version.
* The upper 16-bit is the major version, the the lower the minor version.
* When incompatible changes are made, the upper major number has to be changed.
*
* @todo Pending work on next major version change:
* - Eliminate supdrvPageWasLockedByPageAlloc and supdrvPageGetPhys.
* - Remove SUPR0PageAlloc in favor of SUPR0PageAllocEx, removing
* and renaming the related IOCtls too.
*/
#define SUPDRV_IOC_VERSION 0x000b0000
/** SUP_IOCTL_COOKIE. */
typedef struct SUPCOOKIE
{
/** The header.
* u32Cookie must be set to SUPCOOKIE_INITIAL_COOKIE.
* u32SessionCookie should be set to some random value. */
union
{
struct
{
/** Magic word. */
char szMagic[16];
/** The requested interface version number. */
/** The minimum interface version number. */
} In;
struct
{
/** Cookie. */
/** Session cookie. */
/** Interface version for this session. */
/** The actual interface version in the driver. */
/** Number of functions available for the SUP_IOCTL_QUERY_FUNCS request. */
/** Session handle. */
} Out;
} u;
} SUPCOOKIE, *PSUPCOOKIE;
/** @} */
/** @name SUP_IOCTL_QUERY_FUNCS
* Query SUPR0 functions.
* @{
*/
#define SUP_IOCTL_QUERY_FUNCS_SIZE_IN sizeof(SUPREQHDR)
/** A function. */
typedef struct SUPFUNC
{
/** Name - mangled. */
char szName[32];
/** Address. */
typedef struct SUPQUERYFUNCS
{
/** The header. */
union
{
struct
{
/** Number of functions returned. */
/** Array of functions. */
} Out;
} u;
/** @} */
/** @name SUP_IOCTL_IDT_INSTALL
* Install IDT patch for calling processor.
* @{
*/
#define SUP_IOCTL_IDT_INSTALL_SIZE sizeof(SUPIDTINSTALL)
#define SUP_IOCTL_IDT_INSTALL_SIZE_IN sizeof(SUPREQHDR)
#define SUP_IOCTL_IDT_INSTALL_SIZE_OUT sizeof(SUPIDTINSTALL)
typedef struct SUPIDTINSTALL
{
/** The header. */
union
{
struct
{
/** The IDT entry number. */
} Out;
} u;
/** @} */
/** @name SUP_IOCTL_IDT_REMOVE
* Remove IDT patch for calling processor.
* @{
*/
#define SUP_IOCTL_IDT_REMOVE_SIZE sizeof(SUPIDTREMOVE)
#define SUP_IOCTL_IDT_REMOVE_SIZE_IN sizeof(SUPIDTREMOVE)
#define SUP_IOCTL_IDT_REMOVE_SIZE_OUT sizeof(SUPIDTREMOVE)
typedef struct SUPIDTREMOVE
{
/** The header. */
/** @}*/
/** @name SUP_IOCTL_LDR_OPEN
* Open an image.
* @{
*/
#define SUP_IOCTL_LDR_OPEN_SIZE sizeof(SUPLDROPEN)
#define SUP_IOCTL_LDR_OPEN_SIZE_IN sizeof(SUPLDROPEN)
typedef struct SUPLDROPEN
{
/** The header. */
union
{
struct
{
/** Size of the image we'll be loading. */
/** Image name.
* This is the NAME of the image, not the file name. It is used
* to share code with other processes. (Max len is 32 chars!) */
char szName[32];
} In;
struct
{
/** The base address of the image. */
/** Indicate whether or not the image requires loading. */
bool fNeedsLoading;
} Out;
} u;
} SUPLDROPEN, *PSUPLDROPEN;
/** @} */
/** @name SUP_IOCTL_LDR_LOAD
* Upload the image bits.
* @{
*/
#define SUP_IOCTL_LDR_LOAD_SIZE_OUT sizeof(SUPREQHDR)
/**
* Module initialization callback function.
* This is called once after the module has been loaded.
*
* @returns 0 on success.
* @returns Appropriate error code on failure.
*/
typedef DECLCALLBACK(int) FNR0MODULEINIT(void);
/** Pointer to a FNR0MODULEINIT(). */
/**
* Module termination callback function.
* This is called once right before the module is being unloaded.
*/
typedef DECLCALLBACK(void) FNR0MODULETERM(void);
/** Pointer to a FNR0MODULETERM(). */
/**
* Symbol table entry.
*/
typedef struct SUPLDRSYM
{
/** Offset into of the string table. */
/** Offset of the symbol relative to the image load address. */
} SUPLDRSYM;
/** Pointer to a symbol table entry. */
typedef SUPLDRSYM *PSUPLDRSYM;
/** Pointer to a const symbol table entry. */
typedef SUPLDRSYM const *PCSUPLDRSYM;
/**
* SUPLDRLOAD::u::In::EP type.
*/
typedef enum SUPLDRLOADEP
{
SUPLDRLOADEP_NOTHING = 0,
SUPLDRLOADEP_32BIT_HACK = 0x7fffffff
} SUPLDRLOADEP;
typedef struct SUPLDRLOAD
{
/** The header. */
union
{
struct
{
/** The address of module initialization function. Similar to _DLL_InitTerm(hmod, 0). */
/** The address of module termination function. Similar to _DLL_InitTerm(hmod, 1). */
/** Special entry points. */
union
{
/** SUPLDRLOADEP_VMMR0. */
struct
{
/** The module handle (i.e. address). */
/** Address of VMMR0EntryInt function. */
/** Address of VMMR0EntryFast function. */
/** Address of VMMR0EntryEx function. */
} VMMR0;
/** SUPLDRLOADEP_SERVICE. */
struct
{
/** The service request handler.
* (PFNR0SERVICEREQHANDLER isn't defined yet.) */
/** Reserved, must be NIL. */
} Service;
} EP;
/** Address. */
/** Entry point type. */
/** The offset of the symbol table. */
/** The number of entries in the symbol table. */
/** The offset of the string table. */
/** Size of the string table. */
/** Size of image (including string and symbol tables). */
/** The image data. */
char achImage[1];
} In;
} u;
} SUPLDRLOAD, *PSUPLDRLOAD;
/** @} */
/** @name SUP_IOCTL_LDR_FREE
* Free an image.
* @{
*/
#define SUP_IOCTL_LDR_FREE_SIZE sizeof(SUPLDRFREE)
#define SUP_IOCTL_LDR_FREE_SIZE_IN sizeof(SUPLDRFREE)
#define SUP_IOCTL_LDR_FREE_SIZE_OUT sizeof(SUPREQHDR)
typedef struct SUPLDRFREE
{
/** The header. */
union
{
struct
{
/** Address. */
} In;
} u;
} SUPLDRFREE, *PSUPLDRFREE;
/** @} */
/** @name SUP_IOCTL_LDR_GET_SYMBOL
* Get address of a symbol within an image.
* @{
*/
#define SUP_IOCTL_LDR_GET_SYMBOL_SIZE sizeof(SUPLDRGETSYMBOL)
#define SUP_IOCTL_LDR_GET_SYMBOL_SIZE_IN sizeof(SUPLDRGETSYMBOL)
#define SUP_IOCTL_LDR_GET_SYMBOL_SIZE_OUT (sizeof(SUPREQHDR) + RT_SIZEOFMEMB(SUPLDRGETSYMBOL, u.Out))
typedef struct SUPLDRGETSYMBOL
{
/** The header. */
union
{
struct
{
/** Address. */
/** The symbol name. */
char szSymbol[64];
} In;
struct
{
/** The symbol address. */
} Out;
} u;
/** @} */
/** @name SUP_IOCTL_CALL_VMMR0
* Call the R0 VMM Entry point.
*
* @todo Might have to convert this to a big request...
* @{
*/
typedef struct SUPCALLVMMR0
{
/** The header. */
union
{
struct
{
/** The VM handle. */
/** VCPU id. */
/** Which operation to execute. */
/** Argument to use when no request packet is supplied. */
} In;
} u;
/** The VMMR0Entry request packet. */
/** @} */
/** @name SUP_IOCTL_LOW_ALLOC
* Allocate memory below 4GB (physically).
* @{
*/
#define SUP_IOCTL_LOW_ALLOC_SIZE(cPages) ((uint32_t)RT_UOFFSETOF(SUPLOWALLOC, u.Out.aPages[cPages]))
typedef struct SUPLOWALLOC
{
/** The header. */
union
{
struct
{
/** Number of pages to allocate. */
} In;
struct
{
/** The ring-3 address of the allocated memory. */
/** The ring-0 address of the allocated memory. */
/** Array of pages. */
} Out;
} u;
} SUPLOWALLOC, *PSUPLOWALLOC;
/** @} */
/** @name SUP_IOCTL_LOW_FREE
* Free low memory.
* @{
*/
#define SUP_IOCTL_LOW_FREE_SIZE sizeof(SUPLOWFREE)
#define SUP_IOCTL_LOW_FREE_SIZE_IN sizeof(SUPLOWFREE)
#define SUP_IOCTL_LOW_FREE_SIZE_OUT sizeof(SUPREQHDR)
typedef struct SUPLOWFREE
{
/** The header. */
union
{
struct
{
/** The ring-3 address of the memory to free. */
} In;
} u;
} SUPLOWFREE, *PSUPLOWFREE;
/** @} */
/** @name SUP_IOCTL_PAGE_ALLOC
* Allocate memory and map into the user process.
* The memory is of course locked.
* @{
*/
typedef struct SUPPAGEALLOC
{
/** The header. */
union
{
struct
{
/** Number of pages to allocate */
} In;
struct
{
/** Returned ring-3 address. */
/** The physical addresses of the allocated pages. */
} Out;
} u;
/** @} */
/** @name SUP_IOCTL_PAGE_FREE
* Free memory allocated with SUP_IOCTL_PAGE_ALLOC or SUP_IOCTL_PAGE_ALLOC_EX.
* @{
*/
#define SUP_IOCTL_PAGE_FREE_SIZE sizeof(SUPPAGEFREE)
#define SUP_IOCTL_PAGE_FREE_SIZE_IN sizeof(SUPPAGEFREE)
#define SUP_IOCTL_PAGE_FREE_SIZE_OUT sizeof(SUPREQHDR)
typedef struct SUPPAGEFREE
{
/** The header. */
union
{
struct
{
/** Address of memory range to free. */
} In;
} u;
} SUPPAGEFREE, *PSUPPAGEFREE;
/** @} */
/** @name SUP_IOCTL_PAGE_LOCK
* Pin down physical pages.
* @{
*/
#define SUP_IOCTL_PAGE_LOCK_SIZE(cPages) (RT_MAX((size_t)SUP_IOCTL_PAGE_LOCK_SIZE_IN, (size_t)SUP_IOCTL_PAGE_LOCK_SIZE_OUT(cPages)))
typedef struct SUPPAGELOCK
{
/** The header. */
union
{
struct
{
/** Start of page range. Must be PAGE aligned. */
/** The range size given as a page count. */
} In;
struct
{
/** Array of pages. */
} Out;
} u;
} SUPPAGELOCK, *PSUPPAGELOCK;
/** @} */
/** @name SUP_IOCTL_PAGE_UNLOCK
* Unpin physical pages.
* @{ */
#define SUP_IOCTL_PAGE_UNLOCK_SIZE sizeof(SUPPAGEUNLOCK)
#define SUP_IOCTL_PAGE_UNLOCK_SIZE_IN sizeof(SUPPAGEUNLOCK)
#define SUP_IOCTL_PAGE_UNLOCK_SIZE_OUT sizeof(SUPREQHDR)
typedef struct SUPPAGEUNLOCK
{
/** The header. */
union
{
struct
{
/** Start of page range of a range previuosly pinned. */
} In;
} u;
/** @} */
/** @name SUP_IOCTL_CONT_ALLOC
* Allocate contious memory.
* @{
*/
#define SUP_IOCTL_CONT_ALLOC_SIZE sizeof(SUPCONTALLOC)
#define SUP_IOCTL_CONT_ALLOC_SIZE_OUT sizeof(SUPCONTALLOC)
typedef struct SUPCONTALLOC
{
/** The header. */
union
{
struct
{
/** The allocation size given as a page count. */
} In;
struct
{
/** The address of the ring-0 mapping of the allocated memory. */
/** The address of the ring-3 mapping of the allocated memory. */
/** The physical address of the allocation. */
} Out;
} u;
/** @} */
/** @name SUP_IOCTL_CONT_FREE Input.
* @{
*/
/** Free contious memory. */
#define SUP_IOCTL_CONT_FREE_SIZE sizeof(SUPCONTFREE)
#define SUP_IOCTL_CONT_FREE_SIZE_IN sizeof(SUPCONTFREE)
#define SUP_IOCTL_CONT_FREE_SIZE_OUT sizeof(SUPREQHDR)
typedef struct SUPCONTFREE
{
/** The header. */
union
{
struct
{
/** The ring-3 address of the memory to free. */
} In;
} u;
} SUPCONTFREE, *PSUPCONTFREE;
/** @} */
/** @name SUP_IOCTL_GET_PAGING_MODE
* Get the host paging mode.
* @{
*/
#define SUP_IOCTL_GET_PAGING_MODE_SIZE sizeof(SUPGETPAGINGMODE)
#define SUP_IOCTL_GET_PAGING_MODE_SIZE_IN sizeof(SUPREQHDR)
#define SUP_IOCTL_GET_PAGING_MODE_SIZE_OUT sizeof(SUPGETPAGINGMODE)
typedef struct SUPGETPAGINGMODE
{
/** The header. */
union
{
struct
{
/** The paging mode. */
} Out;
} u;
/** @} */
/** @name SUP_IOCTL_SET_VM_FOR_FAST
* Set the VM handle for doing fast call ioctl calls.
* @{
*/
#define SUP_IOCTL_SET_VM_FOR_FAST_SIZE sizeof(SUPSETVMFORFAST)
#define SUP_IOCTL_SET_VM_FOR_FAST_SIZE_IN sizeof(SUPSETVMFORFAST)
#define SUP_IOCTL_SET_VM_FOR_FAST_SIZE_OUT sizeof(SUPREQHDR)
typedef struct SUPSETVMFORFAST
{
/** The header. */
union
{
struct
{
/** The ring-0 VM handle (pointer). */
} In;
} u;
/** @} */
/** @name SUP_IOCTL_GIP_MAP
* Map the GIP into user space.
* @{
*/
#define SUP_IOCTL_GIP_MAP_SIZE sizeof(SUPGIPMAP)
#define SUP_IOCTL_GIP_MAP_SIZE_IN sizeof(SUPREQHDR)
#define SUP_IOCTL_GIP_MAP_SIZE_OUT sizeof(SUPGIPMAP)
typedef struct SUPGIPMAP
{
/** The header. */
union
{
struct
{
/** The physical address of the GIP. */
/** Pointer to the read-only usermode GIP mapping for this session. */
/** Pointer to the supervisor mode GIP mapping. */
} Out;
} u;
} SUPGIPMAP, *PSUPGIPMAP;
/** @} */
/** @name SUP_IOCTL_GIP_UNMAP
* Unmap the GIP.
* @{
*/
#define SUP_IOCTL_GIP_UNMAP_SIZE sizeof(SUPGIPUNMAP)
#define SUP_IOCTL_GIP_UNMAP_SIZE_IN sizeof(SUPGIPUNMAP)
#define SUP_IOCTL_GIP_UNMAP_SIZE_OUT sizeof(SUPGIPUNMAP)
typedef struct SUPGIPUNMAP
{
/** The header. */
} SUPGIPUNMAP, *PSUPGIPUNMAP;
/** @} */
/** @name SUP_IOCTL_CALL_SERVICE
* Call the a ring-0 service.
*
* @todo Might have to convert this to a big request, just like
* SUP_IOCTL_CALL_VMMR0
* @{
*/
typedef struct SUPCALLSERVICE
{
/** The header. */
union
{
struct
{
/** The service name. */
char szName[28];
/** Which operation to execute. */
/** Argument to use when no request packet is supplied. */
} In;
} u;
/** The request packet passed to SUP. */
/** @} */
/** @name SUP_IOCTL_PAGE_ALLOC_EX
* course locked. This is an extended version of SUP_IOCTL_PAGE_ALLOC and the
* result should be freed using SUP_IOCTL_PAGE_FREE.
*
* @remarks Allocations without a kernel mapping may fail with
* VERR_NOT_SUPPORTED on some platforms just like with
* SUP_IOCTL_PAGE_ALLOC.
*
* @{
*/
typedef struct SUPPAGEALLOCEX
{
/** The header. */
union
{
struct
{
/** Number of pages to allocate */
/** Whether it should have kernel mapping. */
bool fKernelMapping;
/** Whether it should have a user mapping. */
bool fUserMapping;
/** Reserved. Must be false. */
bool fReserved0;
/** Reserved. Must be false. */
bool fReserved1;
} In;
struct
{
/** Returned ring-3 address. */
/** Returned ring-0 address. */
/** The physical addresses of the allocated pages. */
} Out;
} u;
/** @} */
/** @name SUP_IOCTL_PAGE_MAP_KERNEL
* Maps a portion of memory allocated by SUP_IOCTL_PAGE_ALLOC_EX /
* SUPR0PageAllocEx into kernel space for use by a device or similar.
*
* The mapping will be freed together with the ring-3 mapping when
* SUP_IOCTL_PAGE_FREE or SUPR0PageFree is called.
*
* @remarks Not necessarily supported on all platforms.
*
* @{
*/
#define SUP_IOCTL_PAGE_MAP_KERNEL_SIZE sizeof(SUPPAGEMAPKERNEL)
#define SUP_IOCTL_PAGE_MAP_KERNEL_SIZE_IN sizeof(SUPPAGEMAPKERNEL)
#define SUP_IOCTL_PAGE_MAP_KERNEL_SIZE_OUT sizeof(SUPPAGEMAPKERNEL)
typedef struct SUPPAGEMAPKERNEL
{
/** The header. */
union
{
struct
{
/** The pointer of to the previously allocated memory. */
/** The offset to start mapping from. */
/** Size of the section to map. */
/** Flags reserved for future fun. */
} In;
struct
{
/** The ring-0 address corresponding to pvR3 + offSub. */
} Out;
} u;
/** @} */
/** @name SUP_IOCTL_LOGGER_SETTINGS
* Changes the ring-0 release or debug logger settings.
* @{
*/
#define SUP_IOCTL_LOGGER_SETTINGS(cbStrTab) SUP_CTL_CODE_SIZE(25, SUP_IOCTL_LOGGER_SETTINGS_SIZE(cbStrTab))
#define SUP_IOCTL_LOGGER_SETTINGS_SIZE(cbStrTab) RT_UOFFSETOF(SUPLOGGERSETTINGS, u.In.szStrings[cbStrTab])
#define SUP_IOCTL_LOGGER_SETTINGS_SIZE_IN(cbStrTab) RT_UOFFSETOF(SUPLOGGERSETTINGS, u.In.szStrings[cbStrTab])
#define SUP_IOCTL_LOGGER_SETTINGS_SIZE_OUT sizeof(SUPREQHDR)
typedef struct SUPLOGGERSETTINGS
{
/** The header. */
union
{
struct
{
/** Which logger. */
/** What to do with it. */
/** Offset of the flags setting string. */
/** Offset of the groups setting string. */
/** Offset of the destination setting string. */
/** The string table. */
char szStrings[1];
} In;
} u;
/** Debug logger. */
#define SUPLOGGERSETTINGS_WHICH_DEBUG 0
/** Release logger. */
#define SUPLOGGERSETTINGS_WHICH_RELEASE 1
/** Change the settings. */
#define SUPLOGGERSETTINGS_WHAT_SETTINGS 0
/** Create the logger instance. */
#define SUPLOGGERSETTINGS_WHAT_CREATE 1
/** Destroy the logger instance. */
#define SUPLOGGERSETTINGS_WHAT_DESTROY 2
/** @} */
#pragma pack() /* paranoia */
#endif