mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
659 lines
15 KiB
659 lines
15 KiB
|
|
#ifndef _SESPORT_
|
|
|
|
#define _SESPORT_
|
|
|
|
#ifndef _WINCON_
|
|
|
|
typedef struct _COORD
|
|
{
|
|
SHORT X; /* Row */
|
|
SHORT Y; /* Col */
|
|
} COORD, *PCOORD;
|
|
|
|
typedef struct _SMALL_RECT
|
|
{
|
|
SHORT Left;
|
|
SHORT Top;
|
|
SHORT Right;
|
|
SHORT Bottom;
|
|
} SMALL_RECT, *PSMALL_RECT;
|
|
|
|
#endif /* _WINCON_ */
|
|
|
|
#include "os2sub.h"
|
|
#include "os2nls.h"
|
|
#include "sesgrp.h"
|
|
#ifndef BYTE
|
|
typedef UCHAR BYTE;
|
|
#endif
|
|
#ifndef PBYTE
|
|
typedef UCHAR *PBYTE;
|
|
#endif
|
|
#include "os2dev.h"
|
|
|
|
//#include "wincon.h" should be called by the caller to this
|
|
/* this files need to be included if NTOS2_ONLY macro doesn't protect
|
|
* tructures with PORT_MESSAGE:
|
|
*
|
|
* #include <ntdef.h>
|
|
* #include <ntkeapi.h>
|
|
* #include <ntseapi.h>
|
|
* #include <ntpsapi.h>
|
|
* #include <ntlpcapi.h>
|
|
*/
|
|
|
|
#define U_OS2_SS_INITIALIZATION_EVENT L"OS2SSINITIALIZATIONEVENT"
|
|
|
|
/*
|
|
* os2srv port to accept all requests (CON and API) from clients
|
|
*/
|
|
|
|
#define U_OS2_SS_SESSION_PORT_NAME L"\\OS2SS\\SESPORT"
|
|
|
|
/*
|
|
* Session sections and port
|
|
*
|
|
* Each session is identified by an unique id (which is define by the os2srv).
|
|
* For each session, the OS2 creates:
|
|
*
|
|
* - Section to hold all common parameters - SES_GROUP (G)
|
|
* - Port for all input requests (i.e. KBD, MOU and MON) to get to the
|
|
* first OS2.EXE in the session from all processes in that session (P).
|
|
* - Section to serve as the LVB (L)
|
|
*/
|
|
|
|
#define U_OS2_SES_BASE_PORT_NAME L"\\OS2SS\\OS2SES"
|
|
#define U_OS2_SES_BASE_PORT_NAME_LENGTH 32
|
|
#define U_OS2_SES_BASE_PORT_PREFIX L'P' // Port
|
|
#define U_OS2_SES_BASE_DATA_PREFIX L'D' // Data
|
|
#define U_OS2_SES_GROUP_PREFIX L'G' // Session Group Data
|
|
#define U_OS2_SES_BASE_LVB_PREFIX L'L' // LVB
|
|
#define U_OS2_SES_PAUSE_EVENT_PREFIX L'S' // ^S (pause)
|
|
#define U_OS2_SES_CTRL_PORT_SEMAPHORE_PREFIX L'T' // Data Section Semaphore
|
|
#define U_OS2_SES_KBD_PORT_SEMAPHORE_PREFIX L'K' // Kbd Port(requests) Semaphore
|
|
#define U_OS2_SES_MOU_PORT_SEMAPHORE_PREFIX L'M' // Mou Port(requests) Semaphore
|
|
#define U_OS2_SES_KBD_FOCUS_SEMAPHORE_PREFIX L'F' // KbdGetFocus(logical)
|
|
#define U_OS2_SES_POPUP_SEMAPHORE_PREFIX L'O' // PopUp
|
|
#define U_OS2_SES_SLOCK_SEMAPHORE_PREFIX L'C' // Screen Lock
|
|
#define U_OS2_SES_STD_HANDLE_LOCK_PREFIX L'H' // STD-handle lock
|
|
#define U_OS2_SES_VIOWRITE_SEMAPHORE_PREFIX L'W' // Vio Write mutex
|
|
|
|
#define CONSTRUCT_U_OS2_SES_NAME(Name_U, t, id) \
|
|
{ \
|
|
int __cdecl wsprintfW(LPWSTR, LPCWSTR, ...); \
|
|
\
|
|
wsprintfW(Name_U, L"%s\\%c%d", \
|
|
U_OS2_SES_BASE_PORT_NAME, t, id); \
|
|
}
|
|
|
|
/*
|
|
* max message size
|
|
*/
|
|
|
|
#define OS2_CON_PORT_MSG_SIZE 0x10000L
|
|
#define OS2_KBD_PORT_MSG_SIZE 0x200
|
|
#define OS2SES_CTRL_SECTION_SIZE (OS2_CON_PORT_MSG_SIZE + OS2_KBD_PORT_MSG_SIZE)
|
|
#define KBD_OFFSET OS2_CON_PORT_MSG_SIZE
|
|
|
|
#define OS2SES_GROUP_SECTION_SIZE sizeof(OS2_SES_GROUP_PARMS)
|
|
|
|
/*
|
|
* section size
|
|
*
|
|
* The OS2_Ses_BASE_DATA section is combined from the following:
|
|
*
|
|
* - OS2_CON_PORT_MSG_SIZE bytes : data passed between os2.exe and client
|
|
* - OS2_KBD_PORT_MSG_SIZE bytes : kbd data passed from os2.exe to client
|
|
*/
|
|
|
|
#define OS2_MAX_APPL_NAME 13
|
|
|
|
/*
|
|
* Session Console ConnectInfo struct
|
|
*/
|
|
|
|
typedef struct _SCCONNECTINFO
|
|
{ int dummy;
|
|
} SCCONNECTINFO, *PSCCONNECTINFO;
|
|
|
|
typedef struct _VIOSCROLL
|
|
{ SMALL_RECT ScrollRect;
|
|
SHORT cbLines;
|
|
UCHAR Cell[4];
|
|
} VIOSCROLL, *PVIOSCROLL;
|
|
|
|
typedef enum
|
|
{
|
|
VIOWrtTTY,
|
|
VIOWrtStdOut,
|
|
VIOWrtStdErr,
|
|
VIOWrtScreen
|
|
} VIOREQUESTNUMBER;
|
|
|
|
/* -------- End of Vio Requests section -------- */
|
|
|
|
/*
|
|
* Kbd requests
|
|
*/
|
|
|
|
typedef enum
|
|
{ KBDOpen,
|
|
KBDClose,
|
|
KBDDupLogHandle,
|
|
KBDNewFocus,
|
|
KBDFreeFocus,
|
|
KBDCharIn,
|
|
KBDStringIn,
|
|
KBDPeek,
|
|
KBDFlushBuffer,
|
|
KBDReadStdIn,
|
|
KBDRead,
|
|
KBDGetStatus,
|
|
KBDSetStatus,
|
|
KBDXlate,
|
|
KBDGetCp,
|
|
KBDSetCp,
|
|
KBDSetCustXt,
|
|
KBDGetInputMode,
|
|
KBDGetInterimFlag,
|
|
KBDGetKbdType,
|
|
KBDGetHotKey,
|
|
KBDGetShiftState,
|
|
KBDSetInputMode,
|
|
KBDSetShiftState,
|
|
KBDSetTypamaticRate,
|
|
KBDSetInTerimFlag,
|
|
KBDNewCountry
|
|
} KBDREQUESTNUMBER;
|
|
|
|
typedef struct _KBDREQUEST
|
|
{ KBDREQUESTNUMBER Request;
|
|
HANDLE hKbd;
|
|
ULONG fWait;
|
|
ULONG Length; /* Length for string R/W */
|
|
union
|
|
{ KBDKEYINFO KeyInfo;
|
|
STRINGINBUF String;
|
|
KBDINFO KbdInfo;
|
|
KBDTRANS KbdTrans;
|
|
ULONG CodePage;
|
|
UCHAR InputMode;
|
|
UCHAR Interim;
|
|
SHIFTSTATE Shift;
|
|
#ifdef JAPAN
|
|
// MSKK May.07.1993 V-AkihiS
|
|
USHORT KbdType[3];
|
|
#else
|
|
USHORT KbdType;
|
|
#endif
|
|
UCHAR HotKey[8];
|
|
RATEDELAY RateDelay;
|
|
} d;
|
|
} KBDREQUEST, *PKBDREQUEST;
|
|
|
|
/* -------- End of Kbd Requests section -------- */
|
|
|
|
/*
|
|
* Mou requests
|
|
*/
|
|
|
|
typedef enum
|
|
{
|
|
MOUOpen,
|
|
MOUClose,
|
|
MOUReadEventQue,
|
|
MOUFlushQue,
|
|
MOUGetNumQueEl,
|
|
MOUDrawPtr,
|
|
MOURemovePtr,
|
|
MOUGetDevStatus,
|
|
MOUSetDevStatus,
|
|
MOUGetEventMask,
|
|
MOUSetEventMask,
|
|
MOUGetNumButtons,
|
|
MOUGetNumMickeys,
|
|
MOUGetPtrPos,
|
|
MOUSetPtrPos,
|
|
MOUGetPtrShape,
|
|
MOUSetPtrShape,
|
|
MOUGetScaleFact,
|
|
MOUSetScaleFact
|
|
} MOUREQUESTNUMBER;
|
|
|
|
typedef struct _MOUREQUEST
|
|
{ MOUREQUESTNUMBER Request;
|
|
HANDLE hMOU;
|
|
USHORT fWait;
|
|
union
|
|
{ ULONG Setup; /* according to API: DevStatus, EventMask,
|
|
#Buttoms, #Mickeys */
|
|
PTRLOC Loc;
|
|
PTRSHAPE Shape;
|
|
SCALEFACT ScalFact;
|
|
MOUEVENTINFO MouInfo;
|
|
NOPTRRECT NoPtrRect;
|
|
MOUQUEINFO NumEvent;
|
|
} d;
|
|
} MOUREQUEST, *PMOUREQUEST;
|
|
|
|
/* -------- End of Mou Requests section -------- */
|
|
|
|
/*
|
|
* Mon requests
|
|
*/
|
|
|
|
#define MON_BUFFER_SIZE 80
|
|
|
|
typedef enum
|
|
{ KbdDevice,
|
|
MouseDevice,
|
|
Lpt1Device,
|
|
Lpt2Device,
|
|
Lpt3Device
|
|
} MONDEVNUMBER;
|
|
|
|
typedef enum
|
|
{ MONOpen,
|
|
MONReg,
|
|
MONRead,
|
|
MONWrite,
|
|
MONClose
|
|
} MONREQUESTNUMBER;
|
|
|
|
typedef struct _MON_OC
|
|
{
|
|
HANDLE hMON;
|
|
MONDEVNUMBER MonDevice;
|
|
} MON_OC, *PMON_OC;
|
|
|
|
typedef struct _MON_REG
|
|
{
|
|
ULONG Pos;
|
|
ULONG Index;
|
|
USHORT InSize;
|
|
USHORT OutSize;
|
|
PVOID In;
|
|
PVOID Out;
|
|
ULONG ProcessId;
|
|
HANDLE hMON;
|
|
} MON_REG, *PMON_REG;
|
|
|
|
typedef struct _MON_RW
|
|
{
|
|
ULONG ProcessId;
|
|
USHORT Length;
|
|
PVOID MonBuffer;
|
|
USHORT fWait;
|
|
UCHAR ioBuff[MON_BUFFER_SIZE];
|
|
} MON_RW, *PMON_RW;
|
|
|
|
typedef struct _MONREQUEST
|
|
{ MONREQUESTNUMBER Request;
|
|
union
|
|
{
|
|
MON_OC OpenClose;
|
|
MON_REG Reg;
|
|
MON_RW rwParms;
|
|
} d;
|
|
} MONREQUEST, *PMONREQUEST;
|
|
|
|
/* -------- End of Mon Requests section -------- */
|
|
|
|
/*
|
|
* Net requests
|
|
*/
|
|
|
|
typedef enum {
|
|
NETGetDCName,
|
|
NETHandleGetInfo,
|
|
NETServerDiskEnum,
|
|
NETServerEnum2,
|
|
NETServerGetInfo,
|
|
NETServiceControl,
|
|
NETServiceEnum,
|
|
NETServiceGetInfo,
|
|
NETServiceInstall,
|
|
NETShareEnum,
|
|
NETShareGetInfo,
|
|
NETUseAdd,
|
|
NETUseDel,
|
|
NETUseEnum,
|
|
NETUseGetInfo,
|
|
NETUserEnum,
|
|
NETUserGetInfo,
|
|
NETWkstaGetInfo,
|
|
NETAccessAdd,
|
|
NETAccessSetInfo,
|
|
NETAccessDel,
|
|
NETShareAdd,
|
|
NETShareDel,
|
|
NETBios
|
|
} NETREQUESTNUMBER;
|
|
|
|
#define MAXNETMSGSIZE 64
|
|
|
|
typedef struct _NETREQUEST {
|
|
NETREQUESTNUMBER Request;
|
|
char d[MAXNETMSGSIZE];
|
|
} NETREQUEST, *PNETREQUEST;
|
|
|
|
/* -------- End of Net Requests section -------- */
|
|
|
|
/*
|
|
* Console requests
|
|
* these are mapped 1-1 to the win32 Console services
|
|
*/
|
|
|
|
|
|
#define OS2SS_IDABORT 3
|
|
#define OS2SS_IDRETRY 4
|
|
#define OS2SS_IDIGNORE 5
|
|
|
|
/*
|
|
* Prt requests
|
|
*/
|
|
|
|
#define OS2_MAX_PRT_NAME 10
|
|
|
|
typedef enum
|
|
{ PRTOpen,
|
|
PRTClose,
|
|
PRTWrite,
|
|
PRTRead // BUGBUG: do we need it ?
|
|
} PRTREQUESTNUMBER;
|
|
|
|
typedef struct _PRTWRITE
|
|
{ ULONG Length; /* Length for string R/W */
|
|
PVOID Offset;
|
|
} PRTWRITE;
|
|
|
|
typedef struct _PRTOPEN
|
|
{ ULONG Attribute;
|
|
ULONG OpenFlags;
|
|
ULONG OpenMode;
|
|
ULONG Action;
|
|
UCHAR PrinterName[OS2_MAX_PRT_NAME];
|
|
} PRTOPEN, *PPRTOPEN;
|
|
|
|
typedef struct _PRTREQUEST
|
|
{ PRTREQUESTNUMBER Request;
|
|
HANDLE hPrinter;
|
|
union
|
|
{ PRTOPEN Open;
|
|
PRTWRITE Write;
|
|
} d;
|
|
} PRTREQUEST, *PPRTREQUEST;
|
|
|
|
/* -------- End of Prt Requests section -------- */
|
|
|
|
/*
|
|
* TaskManager requests
|
|
*/
|
|
|
|
typedef enum
|
|
{ TmExit,
|
|
TmTitle,
|
|
TmReleaseLPC
|
|
} SCTMREQUESTNUMBER;
|
|
|
|
|
|
typedef struct
|
|
{ SCTMREQUESTNUMBER Request;
|
|
ULONG ExitResults;
|
|
CHAR ErrorText[50];
|
|
} SCTMREQUEST, *PSCTMREQUEST;
|
|
|
|
|
|
/* -------- End of TaskManager Requests section -------- */
|
|
|
|
typedef enum _EXECREQUESTNUMBER
|
|
{ RemoveConsoleThread,
|
|
RestartConsoleThread,
|
|
AddWin32ChildProcess,
|
|
RemWin32ChildProcess
|
|
} EXECREQUESTNUMBER;
|
|
|
|
|
|
typedef struct _WINEXECPGM_MSG
|
|
{
|
|
EXECREQUESTNUMBER Request;
|
|
} WINEXECPGM_MSG, *PWINEXECPGM_MSG;
|
|
|
|
/* -------- End of CreateProcess Requests section -------- */
|
|
|
|
#ifdef DBCS
|
|
// MSKK Dec.18.1992 V-AkihiS
|
|
// Support IMMON API
|
|
/*
|
|
* IMMon requests
|
|
*/
|
|
|
|
typedef enum
|
|
{ IMMONStatus,
|
|
IMMONActive,
|
|
IMMONInactive
|
|
} IMMONREQUESTNUMBER;
|
|
|
|
#pragma pack(1)
|
|
typedef struct _MONINSBLK
|
|
{
|
|
USHORT cb;
|
|
ULONG ulReserved1;
|
|
ULONG ulReserved2;
|
|
ULONG ulReserved3;
|
|
} MONINSBLK, *PMONINSBLK;
|
|
|
|
typedef struct _MONSTATBLK
|
|
{
|
|
USHORT cb;
|
|
USHORT usInfoLevel;
|
|
PUCHAR pInfoBuf;
|
|
USHORT cbInfoBuf;
|
|
} MONSTATBLK, *PMONSTATBLK;
|
|
#pragma pack()
|
|
|
|
typedef struct _IMMONREQUEST
|
|
{ IMMONREQUESTNUMBER Request;
|
|
union
|
|
{ MONSTATBLK MonStatBlk;
|
|
} d;
|
|
} IMMONREQUEST, *PIMMONREQUEST;
|
|
|
|
/* -------- End of IMMON Requests section -------- */
|
|
#endif
|
|
|
|
/*
|
|
* Os2Ses requests:
|
|
* Request for CONSOLE services from OS2 SS and OS2 clients to the console
|
|
* process
|
|
*/
|
|
|
|
typedef enum _SCREQUESTNUMBER
|
|
{ KbdRequest,
|
|
MouRequest,
|
|
MonRequest,
|
|
NetRequest,
|
|
TaskManRequest,
|
|
WinCreateProcess,
|
|
PrtRequest
|
|
#ifdef DBCS
|
|
// MSKK Dec.18.1992 V-AkihiS
|
|
,
|
|
ImmonRequest
|
|
#endif
|
|
} SCREQUESTNUMBER;
|
|
|
|
#ifdef NTOS2_ONLY
|
|
|
|
typedef struct _SCREQUESTMSG
|
|
{ PORT_MESSAGE h;
|
|
union {
|
|
SCCONNECTINFO ConnectionRequest;
|
|
struct {
|
|
SCREQUESTNUMBER Request;
|
|
NTSTATUS Status; // returned status for the request.
|
|
PVOID DataPointer; // for read/write
|
|
union {
|
|
KBDREQUEST Kbd;
|
|
MOUREQUEST Mou;
|
|
MONREQUEST Mon;
|
|
NETREQUEST Net;
|
|
SCTMREQUEST Tm;
|
|
WINEXECPGM_MSG WinExecPgm;
|
|
PRTREQUEST Prt;
|
|
#ifdef DBCS
|
|
// MSKK Dec.18.1992 V-AkihiS
|
|
IMMONREQUEST Immon;
|
|
#endif
|
|
} d;
|
|
};
|
|
};
|
|
} SCREQUESTMSG, *PSCREQUESTMSG;
|
|
|
|
#endif // NTOS2_ONLY
|
|
|
|
#define OS2_SS_VERSION 0x00000201
|
|
|
|
/*
|
|
* OS2 SS Session ConnectInfo struct
|
|
*/
|
|
|
|
typedef union _OS2SESCONNECTINFO {
|
|
struct {
|
|
int SessionDbg;
|
|
ULONG ExpectedVersion;
|
|
HANDLE Win32ForegroundWindow;
|
|
} In;
|
|
|
|
struct {
|
|
ULONG Os2SrvId;
|
|
ULONG SessionUniqueID; // unique ID of the ssesion
|
|
ULONG ProcessUniqueID;
|
|
ULONG IsNewSession; // see definitions below
|
|
ULONG CurrentVersion;
|
|
ULONG Od2Debug;
|
|
} Out;
|
|
|
|
} OS2SESCONNECTINFO, *POS2SESCONNECTINFO;
|
|
|
|
/*
|
|
* IsNewSession definitions
|
|
*
|
|
* 0 - child process, 1 - new session, 2 - child session
|
|
*/
|
|
|
|
#define OS2SS_CHILD_PROCESS 0
|
|
#define OS2SS_NEW_SESSION 1
|
|
#define OS2SS_CHILD_SESSION 2
|
|
|
|
#define OS2SS_IS_SESSION(SessionFlag) \
|
|
(((SessionFlag) == OS2SS_NEW_SESSION) || \
|
|
((SessionFlag) == OS2SS_CHILD_SESSION))
|
|
|
|
#define OS2SS_IS_PROCESS(SessionFlag) \
|
|
((SessionFlag) == OS2SS_CHILD_PROCESS)
|
|
|
|
#define OS2SS_IS_NEW_SESSION(SessionFlag) \
|
|
((SessionFlag) == OS2SS_NEW_SESSION)
|
|
|
|
/*
|
|
* Os2 SS Session requests
|
|
* Requests from the session console process (OS2SES.EXE) to the OS2 SS
|
|
* e.g. Create session, CtrlBreak, etc.
|
|
*/
|
|
|
|
typedef enum _OS2SESREQUESTNUMBER {
|
|
SesCheckPortAndConCreate,
|
|
SesConCreate,
|
|
SesConSignal,
|
|
SesConFocus,
|
|
SesNetBiosPost
|
|
} OS2SESREQUESTNUMBER;
|
|
|
|
typedef struct {
|
|
union
|
|
{
|
|
struct
|
|
{
|
|
HANDLE hEventThread;
|
|
HANDLE hSessionRequestThread;
|
|
HANDLE hProcess;
|
|
HANDLE hThread;
|
|
PVOID SignalDeliverer;
|
|
PVOID ExitListDispatcher;
|
|
PVOID InfiniteSleep;
|
|
PVOID FreezeThread;
|
|
PVOID UnfreezeThread;
|
|
PVOID VectorHandler;
|
|
PVOID CritSectionAddr;
|
|
PVOID ClientPib;
|
|
PVOID ClientOs2Tib;
|
|
ULONG InitialPebOs2Length;
|
|
//ULONG SessionUniqueId;
|
|
ULONG IsNewSession; // see definitions in OS2SESCONNECTINFO
|
|
UCHAR ApplName[OS2_MAX_APPL_NAME];
|
|
} In;
|
|
struct
|
|
{
|
|
HANDLE DeviceDirectory;
|
|
HANDLE CtrlPortHandle;
|
|
ULONG BootDrive;
|
|
ULONG SystemDrive;
|
|
ULONG SessionNumber;
|
|
PVOID GInfoAddr;
|
|
ULONG InitialPebOs2Data[12];
|
|
ULONG Os2TibThreadId; /* Os2Tib: OS/2 ID for the thread */
|
|
ULONG Os2TibVersion; /* Os2Tib: Version number for this structure */
|
|
HANDLE PibProcessId; /* Pib: Process I.D. */
|
|
HANDLE PibParentProcessId; /* Pib: Parent process I.D. */
|
|
HANDLE PibImageFileHandle; /* Pib: Program (.EXE) module handle */
|
|
ULONG PibStatus; /* Pib: Process Status */
|
|
ULONG PibType; /* Pib: Process Type */
|
|
} Out;
|
|
} d;
|
|
} SCREQ_CREATE, *PSCREQ_CREATE;
|
|
|
|
typedef struct {
|
|
int Type;
|
|
} SCREQ_SIGNAL;
|
|
|
|
typedef struct {
|
|
ULONG AppNcbAddr;
|
|
ULONG AppPostAddr;
|
|
ULONG RetCode;
|
|
} SCREQ_NETBIOS;
|
|
|
|
#ifdef NTOS2_ONLY
|
|
|
|
typedef struct _OS2SESREQUESTMSG {
|
|
PORT_MESSAGE h;
|
|
union {
|
|
OS2SESCONNECTINFO ConnectionRequest;
|
|
struct {
|
|
ULONG PortType; // 0 - ApiPort in server; 1 - this port.
|
|
HANDLE Session;
|
|
OS2SESREQUESTNUMBER Request;
|
|
NTSTATUS Status;
|
|
union {
|
|
SCREQ_CREATE Create;
|
|
SCREQ_SIGNAL Signal;
|
|
ULONG FocusSet;
|
|
SCREQ_NETBIOS NetBios;
|
|
} d;
|
|
};
|
|
};
|
|
} OS2SESREQUESTMSG, *POS2SESREQUESTMSG;
|
|
|
|
#endif // NTOS2_ONLY
|
|
|
|
|
|
/*
|
|
* Common macros to access PORT_MESSAGE fields
|
|
*/
|
|
#define PORT_MSG_TYPE(m) ((m).h.u2.s2.Type)
|
|
#define PORT_MSG_DATA_LENGTH(m) ((m).h.u1.s1.DataLength)
|
|
#define PORT_MSG_TOTAL_LENGTH(m) ((m).h.u1.s1.TotalLength)
|
|
#define PORT_MSG_ZERO_INIT(m) ((m).h.u2.ZeroInit)
|
|
|
|
#endif // _SESPORT_
|