-/* $Id:
+/* $Id: pdata.h,v 1.4 2002/03/10 17:03:18 hyperion Exp $
*/
/*
* psx/pdata.h
*
- * POSIX subsystem process environment data structure
+ * POSIX+ subsystem process environment data structure
*
* This file is part of the ReactOS Operating System.
*
/* TYPES */
typedef struct __tagPDX_PDATA
{
- UNICODE_STRING NativePathBuffer;
- UNICODE_STRING CurDir;
- UNICODE_STRING RootPath;
- HANDLE RootHandle;
- __fdtable_t *FdTable;
+ BOOL Spawned; /* TRUE if process has been created through __PdxSpawnPosixProcess() */
+ int ArgCount; /* count of arguments passed to exec() */
+ char **ArgVect; /* array of arguments passed to exec() */
+ char ***Environment; /* pointer to user-provided environ variable */
+ UNICODE_STRING NativePathBuffer; /* static buffer used by low-level calls for pathname conversions */
+ UNICODE_STRING CurDir; /* current working directory */
+ UNICODE_STRING RootPath; /* NT path to the process's root directory */
+ HANDLE RootHandle; /* handle to the process's root directory */
+ __fdtable_t FdTable; /* file descriptors table */
} __PDX_PDATA, * __PPDX_PDATA;
+/* serialized process data block, used by __PdxSpawnPosixProcess() and __PdxExecThunk().
+ The layout of buffers inside the Buffer byte array is as following:
+
+ ArgVect[0] + null byte
+ ArgVect[1] + null byte
+ ...
+ ArgVect[ArgCount - 1] + null byte
+ Environment[0] + null byte
+ Environment[1] + null byte
+ ...
+ Environment[n - 1] + null byte (NOTE: the value of n is stored in ProcessData.Environment)
+ CurDir.Buffer
+ RootPath.Buffer
+ FdTable.Descriptors[0]
+ FdTable.Descriptors[1]
+ ...
+ FdTable.Descriptors[FdTable.AllocatedDescriptors - 1]
+ FdTable.Descriptors[x].ExtraData
+ FdTable.Descriptors[y].ExtraData
+ ...
+ padding for page boundary alignment
+ */
+typedef struct __tagPDX_SERIALIZED_PDATA
+{
+ __PDX_PDATA ProcessData;
+ ULONG AllocSize;
+ BYTE Buffer[1];
+} __PDX_SERIALIZED_PDATA, *__PPDX_SERIALIZED_PDATA;
+
/* CONSTANTS */
/* PROTOTYPES */
+NTSTATUS STDCALL __PdxSerializeProcessData(IN __PPDX_PDATA, OUT __PPDX_SERIALIZED_PDATA *);
+NTSTATUS STDCALL __PdxUnserializeProcessData(IN OUT __PPDX_SERIALIZED_PDATA *, OUT __PPDX_PDATA * OPTIONAL);
/* MACROS */
#define __PdxAcquirePdataLock() (RtlAcquirePebLock())
#define __PdxReleasePdataLock() (RtlReleasePebLock())
-#define __PdxSetProcessData()(PPDATA) ((void)((NtCurrentPeb()->SubSystemData) = (PPDATA)))
-#define __PdxGetProcessData() ((__PPDX_PDATA)(&(NtCurrentPeb()->SubSystemData)))
+#define __PdxSetProcessData(PPDATA) ((void)((NtCurrentPeb()->SubSystemData) = (PPDATA)))
+#define __PdxGetProcessData() ((__PPDX_PDATA)(&(NtCurrentPeb()->SubSystemData)))
#define __PdxGetNativePathBuffer() ((PUNICODE_STRING)(&(__PdxGetProcessData()->NativePathBuffer)))
#define __PdxGetCurDir() ((PUNICODE_STRING)(&(__PdxGetProcessData()->CurDir)))